在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;
}