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 ?
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 ",sum); 50 } 51 return 0; 52 }