HDU2845 DP

Beans

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4451    Accepted Submission(s): 2103


Problem Description
Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect the qualities, but everyone must obey by the following rules: if you eat the bean at the coordinate(x, y), you can’t eat the beans anyway at the coordinates listed (if exiting): (x, y-1), (x, y+1), and the both rows whose abscissas are x-1 and x+1.


Now, how much qualities can you eat and then get ?
 

 

Input
There are a few cases. In each case, there are two integer M (row number) and N (column number). The next M lines each contain N integers, representing the qualities of the beans. We can make sure that the quality of bean isn't beyond 1000, and 1<=M*N<=200000.
 

 

Output
For each case, you just output the MAX qualities you can eat and then get.
 

 

Sample Input
4 6
11 0 7 5 13 9
78 4 81 6 22 4
1 40 9 34 16 10
11 22 0 33 39 6
 

 

Sample Output
242
 
题意:
每一个格子有一个豆子,豆子有质量,每一行相邻的两个豆子不能同时选必须相隔,每一列也不能同时选,选了一列的某几个豆子则它的上一列和下一列不能选,问最多选到的豆子质量。
代码:
 1 /*
 2 两次dp,算出每一行的最大值,再用每一行的最大值组成一列算出这列的最大值即可。
 3 */
 4 #include<iostream>
 5 #include<string>
 6 #include<cstdio>
 7 #include<cmath>
 8 #include<cstring>
 9 #include<algorithm>
10 #include<vector>
11 #include<iomanip>
12 #include<queue>
13 #include<stack>
14 using namespace std;
15 int n,m;
16 int x[200000];
17 int dp[200000][2];
18 int a[200000];
19 int main()
20 {
21     while(scanf("%d%d",&n,&m)!=EOF)
22     {
23         memset(x,0,sizeof(x));
24         for(int i=1;i<=n;i++)
25         {
26             memset(dp,0,sizeof(dp));
27             for(int j=1;j<=m;j++)
28             {
29                 scanf("%d",&a[j]);
30             }
31             dp[1][1]=a[1];
32             dp[1][0]=0;
33             for(int j=2;j<=m;j++)
34             {
35                 dp[j][1]=dp[j-1][0]+a[j];
36                 dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
37             }
38             x[i]=max(dp[m][0],dp[m][1]);
39         }
40         memset(dp,0,sizeof(dp));
41         dp[1][1]=x[1];
42         dp[1][0]=0;
43         for(int i=2;i<=n;i++)
44         {
45             dp[i][1]=dp[i-1][0]+x[i];
46             dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
47         }
48         int sum=max(dp[n][1],dp[n][0]);
49         printf("%d\n",sum);
50     }
51     return 0;
52 }

 

posted @ 2016-08-24 15:09  luckilzy  阅读(229)  评论(0编辑  收藏  举报