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