思路:
二维动态规划,用二维数组sum[i][j]表示在第i秒时在j位置处所能接到的最大的馅饼数,a[i][j]表示第i秒时在j位置处所下落的馅饼数,则sum[i][j]的状态由sum[i-1][j+1]和sum[i-1][j]和sum[i-1][j-1]决定,即:sum[i][j]=max(max(sum[i-1][j],sum[i-1][j+1]),sum[i-1][j-1])+a[i][j];
最终对每个位置的时间状态为最后时间进行比较,找出最大值。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[100010][12];
int sum[100010][12];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
int maxn=-1;
for(int i=1;i<=n;i++)
{
int t,x;
scanf("%d%d",&x,&t);
a[t][x]++;
maxn=max(t,maxn);
}
sum[1][4]=a[1][4];
sum[1][5]=a[1][5];
sum[1][6]=a[1][6];
for(int i=2;i<=maxn;i++)
{
for(int j=0;j<11;j++)
{
if(j==0)
sum[i][j]=max(sum[i-1][j],sum[i-1][j+1]);
else
sum[i][j]=max(max(sum[i-1][j],sum[i-1][j+1]),sum[i-1][j-1]);
sum[i][j]+=a[i][j];
}
}
int ans=-1;
for(int i=0;i<11;i++)
ans=max(ans,sum[maxn][i]);
printf("%d\n",ans);
}
return 0;
}