这道题目把状态拆分一下,变成数塔的模型来做就OK了~~~ dp方程:dp[i-1][j]+=max(dp[i][j-1],dp[i][j],dp[i][j+1]); 注意一下范围,并且从下往上循环 #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; int dp[100005][15]; int max(int a,int b,int c) { if(a>=b&&a>=c) return a; else if(b>=a&&b>=c) return b; else if(c>=a&&c>=b) return c; } int main() { int n; while(scanf("%d",&n),n) { memset(dp,0,sizeof(dp)); //录入数据 int x,T; int t=0; for(int i=1;i<=n;++i) { scanf("%d%d",&x,&T); dp[T][x+1]++; t=max(t,T); } //DP for(int i=t-1;i>=0;--i) for(int j=1;j<=11;++j) dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1]); printf("%d/n",dp[0][6]); } return 0; }