http://acm.hdu.edu.cn/showproblem.php?pid=1176
类似数塔的dp,注意边界处理!!!
View Code
#include <stdio.h> #include <string.h> int dp[110000][30]; int max3(int a,int b,int c) { int maxnum=a; if(maxnum<b)maxnum=b; if(maxnum<c)maxnum=c; return maxnum; } int max2(int a,int b) { return a>b?a:b; } int main() { int n,x,T; int i,j; int maxnum; while(scanf("%d",&n),n) { memset(dp,0,sizeof(dp)); maxnum=-10000000; for(i=0;i<n;i++) { scanf("%d%d",&x,&T); dp[T][x]++; if(maxnum<T)maxnum=T; } for(i=maxnum;i>=0;i--) for(j=10;j>=0;j--) if(j==0) dp[i][j]+=max2(dp[i+1][j],dp[i+1][j+1]); else if(j==10) dp[i][j]+=max2(dp[i+1][j],dp[i+1][j-1]); else dp[i][j]+=max3(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]); printf("%d\n",dp[0][5]); } return 0; }