Yui的狗窝
Yui的狗窝
hdoj 2182 frog 简单搜索

原题:http://acm.hdu.edu.cn/showproblem.php?pid=2182

总之很简单的题目,题目大意是给出N个点,每次移动的距离在A,B之间,移动次数不超过K,最终输出访问过的点之和的最大值。
先是用了dfs写了一遍,但是wa了,也查不出哪里有错。

#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=101;
int T,N,A,B,K,res,tem,steps;
int ins[MAXN],vis[MAXN][MAXN];
void dfs(int start)
{
    if(steps==K)
    {
        res=res>tem?res:tem;
        return;
    }
    for(int i=A;i<=B;i++)
    {
        if(start+i<n)
        {
            tem+=ins[start+i];
            steps++;
            if(tem>vis[start+i][steps])
            {
                vis[start+i][steps]=tem;
                dfs(start+i);
            }
            steps--;
            tem-=ins[start+i];
        }
    }
}
int main()
{
    cin>>T;
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        cin>>N>>A>>B>>K;
        for(int i=0;i!=N;i++)
            cin>>ins[i];
        res=0;
        tem=ins[0];
        steps=0;
        dfs(0);
        cout<<res<<endl;
    }
}

最后用了bfs过得。

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct point
{
    int pos,num,steps;
};
const int MAXN=201;
int ins[MAXN],vis[MAXN][MAXN];
int T,N,A,B,K,res;
void bfs()
{
    queue<point> q;
    point cur,next;
    cur.pos=0;
    cur.num=ins[0];
    cur.steps=0;
    q.push(cur);
    while(!q.empty())
    {
        cur=q.front();
        q.pop();
    //  if(cur.steps==K)
        if(cur.steps==K||cur.pos>=N)
        {
            res=res>cur.num?res:cur.num;
            continue;
        }
        for(int i=A;i<=B;i++)
        {
            next=cur;
            next.pos+=i;
            next.num+=ins[next.pos];
            next.steps++;
            if(vis[next.pos][next.steps]<next.num)
            {
                q.push(next);
                vis[next.pos][next.steps]=next.num;
            }
        }
    }
}
int main()
{
    cin>>T;
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        memset(ins,0,sizeof(ins));//这道题测试用例很迷,把这两条memset写在while外面也能ac
        cin>>N>>A>>B>>K;
        for(int i=0;i!=N;i++)
            cin>>ins[i];
        res=0;
        bfs();
        cout<<res<<endl;
    }
}
没有标签
首页      算法训练      hdoj 2182 frog 简单搜索
https://secure.gravatar.com/avatar/d0fe7f1b17d5e9122db921e3a8cc327f?s=256&d=mm&r=g

Suzumiya, Yui

文章作者

发表评论

textsms
account_circle
email

Yui的狗窝

hdoj 2182 frog 简单搜索
原题:http://acm.hdu.edu.cn/showproblem.php?pid=2182 总之很简单的题目,题目大意是给出N个点,每次移动的距离在A,B之间,移动次数不超过K,最终输出访问过的点之和的最大值。 先是用…
扫描二维码继续阅读
2017-09-04


没有激活的小工具