NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 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\n",maxsum);
47         for(i=1;i<=maxtime;i++)
48             for(j=0;j<11;j++)
49                 map[i][j]=0;
50 //把map清零;
51     }
52 }
View Code

 

posted on 2017-03-16 18:34  NWU_ACM  阅读(129)  评论(0编辑  收藏  举报