Beans
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1945 Accepted Submission(s): 984
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
Source
2009 Multi-University Training Contest 4 - Host by HDU
Recommend
gaojie
這題目是DP,DP自己獨立做出來的次數不多,而這次是獨立做出來的,哈哈哈,有點欣喜
其實這題分析後就會發現 可以先求整行的最大值用dp,知道每行的的最大值後在求整體的最大值用DP。其思路是一樣的。 求行的最大值公式 0代表不選,1代表選
dp[j][0] = max(dp[j-1][1],dp[j-1][0]);
dp[j][1] = max(dp[j-2][0],dp[j-2][1]);
val=max(dp[j][0],dp[j][1]);
同樣的方法處理整體。 注意處理邊界啊
[cpp] /***************************************************************
> File Name: a.cpp
> Author: SDUT_GYX
> Mail: [email protected]
> Created Time: 2013/5/23 23:48:46
**************************************************************/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <stack>
#define LL long long
using namespace std;
int a[210000],dp_row[210000][2],dp_col[210000][2];
int main()
{
// freopen("data1.in","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=0;i<=n-1;i++)
{
for(int j=0;j<=m-1;j++)
{
int x=i*m+j;
scanf("%d",&a[x]);
}
}
int val,res=0;
for(int i=0;i<=n-1;i++)
{
val=0;
for(int j=0;j<=m-1;j++)
{
int x=i*m+j;
if(j==0)
{
dp_row[j][0] = 0;
dp_row[j][1] = a[x];
val = max(val,dp_row[j][1]);
continue;
}else if(j==1)
{
dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
dp_row[j][1] = a[x];
val = max(val,dp_row[j][0]);
val = max(val,dp_row[j][1]);
continue;
}
dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
dp_row[j][1] = max(dp_row[j-2][0], dp_row[j-2][1]) +a[x];
val = max(val,dp_row[j][0]);
val = max(val,dp_row[j][1]);
}
if(i==0)
{
dp_col[i][0] = 0;
dp_col[i][1] = val;
res = max(res,dp_col[i][1]);
continue;
}else if(i==1)
{
dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
dp_col[i][1] = val;
res = max(res,dp_col[i][1]);
res = max(res,dp_col[i][0]);
continue;
}
dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
dp_col[i][1] = max(dp_col[i-2][0],dp_col[i-2][1]) + val;
res = max(res,dp_col[i][0]);
res = max(res,dp_col[i][1]);
}
printf("%d\n",res);
}
return 0;
}
/***************************************************************
> File Name: a.cpp
> Author: SDUT_GYX
> Mail: [email protected]
> Created Time: 2013/5/23 23:48:46
**************************************************************/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <stack>
#define LL long long
using namespace std;
int a[210000],dp_row[210000][2],dp_col[210000][2];
int main()
{
// freopen("data1.in","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=0;i<=n-1;i++)
{
for(int j=0;j<=m-1;j++)
{
int x=i*m+j;
scanf("%d",&a[x]);
}
}
int val,res=0;
for(int i=0;i<=n-1;i++)
{
val=0;
for(int j=0;j<=m-1;j++)
{
int x=i*m+j;
if(j==0)
{
dp_row[j][0] = 0;
dp_row[j][1] = a[x];
val = max(val,dp_row[j][1]);
continue;
}else if(j==1)
{
dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
dp_row[j][1] = a[x];
val = max(val,dp_row[j][0]);
val = max(val,dp_row[j][1]);
continue;
}
dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
dp_row[j][1] = max(dp_row[j-2][0], dp_row[j-2][1]) +a[x];
val = max(val,dp_row[j][0]);
val = max(val,dp_row[j][1]);
}
if(i==0)
{
dp_col[i][0] = 0;
dp_col[i][1] = val;
res = max(res,dp_col[i][1]);
continue;
}else if(i==1)
{
dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
dp_col[i][1] = val;
res = max(res,dp_col[i][1]);
res = max(res,dp_col[i][0]);
continue;
}
dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
dp_col[i][1] = max(dp_col[i-2][0],dp_col[i-2][1]) + val;
res = max(res,dp_col[i][0]);
res = max(res,dp_col[i][1]);
}
printf("%d\n",res);
}
return 0;
}