[ An Ac a Day ^_^ ] [kuangbin带你飞]专题十二 HDU 1176 免费馅饼

题意:

中文题意不解释……

 

思路:

先把x,T存到矩阵里 然后像数塔一样从最底层走一边就行了

dp[i][j]代表在时间为j时 第i个位置最多能吃到多少个馅饼

最后输出第0时刻的5位置的馅饼数量就好了

 

 1 /* ***********************************************
 2 Author        :Sun Yuefeng
 3 Created Time  :2016/11/8 18:56:49
 4 File Name     :dp.cpp
 5 ************************************************ */
 6 
 7 #include<cstdio>
 8 #include<iostream>
 9 #include<algorithm>
10 #include<cmath>
11 #include<cstring>
12 #include<string>
13 #include<bitset>
14 #include<map>
15 #include<set>
16 #include<stack>
17 #include<vector>
18 #include<queue>
19 #include<list>
20 #define M(a,b) memset(a,b,sizeof(a))
21 using namespace std;
22 typedef long long ll;
23 const int inf=0x3f3f3f3f;
24 const int maxn=2e5+10;
25 const int mod=1e7+7;
26 int dx[8]= {0,0,1,-1,1,-1,1,-1};
27 int dy[8]= {1,-1,0,0,-1,1,1,-1};
28 
29 int dp[15][maxn];
30 
31 int main()
32 {
33     //freopen("in.txt","r",stdin);
34     //freopen("out.txt","w",stdout);
35        int n;
36        while(~scanf("%d",&n)&&n)
37     {
38         M(dp,0); //初始化矩阵
39         int maxtime=-1,x,T;
40         for(int i=0;i<n;i++)
41         {
42             scanf("%d%d",&x,&T);
43             if(T>maxtime) maxtime=T; //记录最长时间
44             dp[x][T]++; //T时刻x位置的馅饼+1
45         }
46         for(int i=maxtime;i>=1;i--)
47         {
48             dp[0][i-1]+=max(dp[1][i],dp[0][i]); //边界特殊处理
49             dp[10][i-1]+=max(dp[10][i],dp[9][i]);
50             for(int j=1;j<=9;j++)
51             { //动态方程
52                 dp[j][i-1]+=max(dp[j-1][i],max(dp[j][i],dp[j+1][i])); 
53             }
54         }
55         printf("%d\n",dp[5][0]);
56     }    
57     return 0;
58 }

 

posted @ 2016-11-08 19:52  良将ℓ  阅读(119)  评论(0编辑  收藏  举报