思路:这道题是数塔模型的一种变形。
首先,我们会看到,随着时间的不同,落下馅饼的位置也会不同,那么我们会考虑到,我们想到第i个点去接馅饼时候,会发现这时我们拥有的馅饼数量是(即状态转移方程):
dp[当前时间][当前位置]+=dp[当前时间-1][上一个位置(细致思考会发现有3个位置)]
所以AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 100005; int dp[N][12]; int main() { int n,t,x,maxx,m; while(~scanf("%d",&n)) { if(n==0)break; m=n; maxx=0; memset(dp,0,sizeof(dp)); while(m--) { scanf("%d%d",&x,&t); dp[t][x] ++; if(maxx<t)maxx=t; //优化层次 } for(int i=maxx-1;i >= 0;i --) //从倒数第二层開始向上 { dp[i][0]+=max(dp[i+1][0],dp[i+1][1]); //边界的特殊情况 for(int j=1;j<11;j++) dp[i][j]+=max(max(dp[i+1][j-1],dp[i+1][j]),dp[i+1][j+1]); //3个上一状态的最大值 } printf("%d ",dp[0][5]); //顶点 } return 0; }