1 #include<stdio.h> 2 int sum[100005][15]={0},map[100005][15]={0};//map[t][x]记录在t秒时第x个位置有几个馅饼落下 3 int max(int a,int b,int c) 4 { 5 if(a<b) a=b; 6 if(a<c) a=c; 7 return a; 8 } 9 //返回三个数中最大数的函数 10 int main() 11 { 12 int i,j,k,l,n,m,maxtime,maxsum,a,b; 13 while(scanf("%d",&n)!=EOF) 14 { 15 if(n==0) break; 16 maxtime=0; 17 for(i=1;i<=n;i++) 18 { 19 scanf("%d%d",&a,&b); 20 map[b][a]++; 21 if(maxtime<b) maxtime=b;//maxtime记录最大时间 22 } 23 for(i=0;i<=maxtime;i++) 24 for(j=0;j<12;j++) 25 sum[i][j]=0; 26 //对sum数组清零 27 for(i=1;i<5;i++) 28 for(j=i+1;j<=5;j++) 29 { 30 map[i][5+j]=0; 31 map[i][5-j]=0; 32 } 33 //注意:因为前5秒时有些地方是到不了的,所以那里的馅饼直接无视清零; 34 for(i=1;i<=maxtime;i++) 35 { 36 for(j=0;j<11;j++) 37 { 38 sum[i][j]=max(sum[i-1][j-1],sum[i-1][j],sum[i-1][j+1])+map[i][j];//dp方程; 39 } 40 } 41 maxsum=0; 42 for(i=0;i<12;i++) 43 { 44 if(sum[maxtime][i]>maxsum) maxsum=sum[maxtime][i]; 45 }//选出最后时间中获得馅饼最多的数量; 46 printf("%d ",maxsum); 47 for(i=1;i<=maxtime;i++) 48 for(j=0;j<11;j++) 49 map[i][j]=0; 50 //把map清零; 51 } 52 }