zstu 2533 hdu 1176 免费馅饼

在zstuoj上dfs 会wa诶。。不过感觉hdu上的数据有点弱。。
应该dfs有问题吧。。但是没看出来哪里有问题。。
好困扰。。希望有人指点
dfs版

#include<stdio.h>
#include<string.h>
int max(int g,int h)
{
    return g>h?g:h;
}
int maxtime;
int map[110010][15];
int way[110010][15];
int dfs(int me,int time)
{
    if(time>maxtime)
        return 0;
    if(me<0||me>10)
        return -0x3f3f3f3f;
    if(way[time][me]>=0)
        return way[time][me];
    way[time][me]=max(dfs(me-1,time+1),max(dfs(me,time+1),dfs(me+1,time+1)))+map[time][me];
    return way[time][me];
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        memset(map,0,sizeof(map));
        memset(way,-1,sizeof(way));
        int x,t;
        maxtime=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&t);
            map[t][x]++;
            maxtime=max(maxtime,t);
        }
        int ans=dfs(5,0)+map[0][5];
        printf("%d\n",ans);
    }
    return 0;
}

下面是dp的代码。。两个都能过
我的理解是:
如果按照时间下去的话。。就要知道人物的位置,而人物的位置在不同的起点有不同的范围。。所以很麻烦。
进过大神的提示,知道了人物在进过几分钟后就会出现在数轴上的任意位置。。这样就可以倒过来看。。

人物先穿越到最后一刻,在任意位置捡东西,然后按照逆时间的顺序来捡,最后回到一开始5这个点。。

然后知道了,如果时间不够的话,有些地方是永远传达不到位置5的,正如按照时间顺序是达不到那些地方的,所以完全不用担心了。。

最后发现map和dp可以合并的。。就合并了。。

#include<stdio.h>
#include<string.h>
int max(int g,int h)
{
    return g>h?g:h;
}
int maxtime;
int dp[110010][11];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        memset(dp,0,sizeof(dp));
        int x,t;
        maxtime=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&t);
            dp[t][x]++;
            maxtime=max(maxtime,t);
        }
        for(int i=maxtime-1;i>=0;i--)
        {
            for(int j=0;j<=10;j++)
            {
                if(j==0)
                dp[i][j]=dp[i][j]+max(dp[i+1][1],dp[i+1][0]);
                else if(j==10)
                dp[i][j]=dp[i][j]+max(dp[i+1][10],dp[i+1][9]);
                else
                dp[i][j]=dp[i][j]+max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
            }
        }
        printf("%d\n",dp[0][5]);

    }
    return 0;
}

你可能感兴趣的:(dp,DFS)