终于AC了,简简单单道题 费了那么多时间 哎
/*免费馅饼
zhh
动态规划————————————————————时间对应搞清楚
*/
#include <iostream>
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100005
int a[11][MAX],dp[11][MAX];//a[i][j]第j秒,落在位置i的馅饼的个数
using namespace std;
int _max(int,int,int);
int _max(int,int);
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int k=0,p=0;
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
int x,t;//x表示位置,t表示时间
scanf("%d%d",&x,&t);
a[x][t]++;
if(t>p)//p,记录最后的时间
p=t;
}
for(int j=1;j<=p;j++)
for(int i=0;i<11;i++)
{
if((i+j)<5||(i-j)>5)
dp[i][j]=0;
else if(i!=10&&i!=0)
dp[i][j]=a[i][j]+_max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1]);
else if(i==10)
dp[i][j]=a[i][j]+_max(dp[i-1][j-1],dp[i][j-1]);
else
dp[i][j]=a[i][j]+_max(dp[i][j-1],dp[i+1][j-1]);
}
for(int i=0;i<11;i++)
{
if(dp[i][p]>k)
k=dp[i][p];
}
printf("%d\n",k);
}
return 0;
}
int _max(int a,int b)
{
return (a>b?a:b);
}
int _max(int a,int b,int c)
{
return _max(_max(b,c),a);
}