http://acm.hdu.edu.cn/showproblem.php?pid=1176
中文题,问题很简单,就是求他最多能接到多少个馅饼
这个题如果打出二维时间位置表很容易看出来和
杭电2084数塔
一样,都可以从最下面开始往上推,看总和最大。他能走的除了在0和10位置外都有3种选择。
如下图括号里面的是和。 行代表时间t,列代表位置。
注意:起点必须是从5开始(绿色区域),所以最终求的结果应该是这里的最大值。
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int dp[100010][11]; int main() { int n,i,j,maxx,tim,x,t; while(scanf("%d",&n)&&n) { tim = 0; memset(dp,0,sizeof(dp)); for(i = 0; i < n; i++) { scanf("%d%d",&x,&t); dp[t][x]++; if(t > tim) //记录最大时间 { tim = t; } } maxx = 0; for(i = tim-1; i >= 0; i--) //从倒数第二层开始求和 { for(j = 0; j < 11; j++) { if(j == 0) { dp[i][j] = max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j+1]); } else { if(j == 10) { dp[i][j] = max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j-1]); } else { dp[i][j] = max(max(dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j-1]),dp[i][j]+dp[i+1][j+1]); } } if(dp[i][j] > maxx) { maxx = dp[i][j]; } } } printf("%d ",dp[0][5]); } return 0; }