
6 5 1 4 1 6 1 7 2 7 2 8 3 0
4
记得以前在nyoj做过一次。
既然是有t秒11个位置。我们可以把这些数想象承有t层,每层有11个数的数塔。
然后从下往上遍历即可。用一个二维数组表示数塔。
#include <stdio.h>
#include <string.h>
int dp[15][100005];
int max(int x,int y,int z)
{
int t=x;
if(y>t)
t=y;
if(z>t)
t=z;
return t;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int Max=0;
memset(dp,0,sizeof(dp));//初始化,别忘了、
for(int i=0;i<n;i++)
{
int x,t;
scanf("%d %d",&x,&t);
dp[x+1][t]++;//把坐标都+1。(因为你遍历的时候有个x-1,避免负值)
if(t>Max)
Max=t;
}
for(int i=Max-1;i>=0;i--)//DP,从下往上遍历,从Max-1秒开始
{
for(int j=1;j<=11;j++)
dp[j][i]=max(dp[j-1][i+1],dp[j][i+1],dp[j+1][i+1])+dp[j][i];
}
printf("%d\n",dp[6][0]);//输出第一次站的位置
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/su20145104009/article/details/47376475