由于数轴1E1所以构建dp[time][location]和v[time][location]存储馅饼掉落时间和位置
状态转移方程:
dp[i][j]=max(max(dp[i-1][j-1]+v[i][j],dp[i-1][j]+v[i][j]),dp[i-1][j+1]+v[i][j]);
由于初始点=5,所以
dp[1][4]=v[1][4];
dp[1][5]=v[1][5];
dp[1][6]=v[1][6];
注意一下二重循环j的取值
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1E5+5;
const int INF=1<<30;
int dp[maxn][12];
int v[maxn][12];
int main ()
{
int a,b,n,ans;
while (~scanf ("%d",&n))
{
if (n==0)
break;
memset (dp,0, sizeof(dp));
memset (v,0, sizeof(v));
for (int i=1;i<=n;i++)
{
scanf ("%d%d",&a,&b);
v[b][a]++;
}
dp[1][4]=v[1][4];
dp[1][5]=v[1][5];
dp[1][6]=v[1][6];
for (int i=2;i<=maxn;i++)
for (int j=0;j<=11;j++)
{
if (j==0)
dp[i][j]=max(dp[i-1][j]+v[i][j],dp[i-1][j+1]+v[i][j]);
else if (j==11)
dp[i][j]=max(dp[i-1][j]+v[i][j],dp[i-1][j-1]+v[i][j]);
else
dp[i][j]=max(max(dp[i-1][j-1]+v[i][j],dp[i-1][j]+v[i][j]),dp[i-1][j+1]+v[i][j]);
}
ans=0;
for (int i=0;i<=11;i++)
ans=max(ans,dp[maxn][i]);
printf ("%d\n",ans);
}
return 0;
}