http://acm.hdu.edu.cn/submit.php?pid=1176
数塔问题!
这道题注意t可以等于0
数组一定要注意,不要开小了!!!
递推的方式来构造算法!
#include <iostream> using namespace std; int dp[100010][11]; int v[100010][11]; int max(int x,int y){ if(x>y) return x; else return y; } int max(int x,int y,int z){ if(x<y) swap(x,y); if(x<z) swap(x,z); return x; } int main() { int n,i,j; int x,T; int max_T; while(scanf("%d",&n)&&n){ memset(dp,0,sizeof(dp)); memset(v,0,sizeof(v)); max_T=0; for(i=1;i<=n;i++){ scanf("%d%d",&x,&T); v[T][x]++; max_T=max(T,max_T); } for(i=0;i<11;i++) dp[max_T][i]=v[max_T][i]; for(i=max_T-1;i>=0;i--) for(j=0;j<11;j++){ if(j==0) dp[i][j]=v[i][j]+max(dp[i+1][j],dp[i+1][j+1]); else if(j==10) dp[i][j]=v[i][j]+max(dp[i+1][j],dp[i+1][j-1]); else dp[i][j]=v[i][j]+max(dp[i+1][j],dp[i+1][j-1],dp[i+1][j+1]); } cout<<dp[0][5]<<endl; } return 0; }