画个图仔细考虑一下,注意弄清存的是什么
DP ,类似于数塔的变形,只不过是每个数下面要取的是三个数的最大值,另外注意边界。
第0秒
第1秒
第2秒
第3秒
第4秒
第5秒
第6秒
第7秒
dp[i][j]+=max(dp[i-1][j+1],dp[i][j],dp[i+1][j+1])
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int dp[13][100001],n,t=0;
void init()
{
int x,tt;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&tt);
dp[x][tt]++;
t=t>tt?t:tt;
}
}
//dp[i][j]代表第j秒在第i位置时接的最多馅饼
int main()
{
while(~scanf("%d",&n)&&n)
{
init();
for(int i=t-1;i>=0;i--)//表示时间
{
dp[0][i]+=max(dp[0][i+1],dp[1][i+1]);
for(int j=10;j>0;j--)//表示位置
{
dp[j][i]=max(dp[j-1][i+1],max(dp[j][i+1],dp[j+1][i+1]))+dp[j][i];
}
}
printf("%d\n",dp[5][0]);
}
return 0;
}