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
解析
首先题目要求如果拿了(x,y)这个位置的数字,那么(x,y-1),(x,y+1)都不能再拿了。
如果拿了x行的那么x+1行和x-1行也不能再拿了。
我们先分析一行,dp[i]表示当前的最大和,那么dp[i] = max(dp[i - 1], dp[i - 2] + a[i]);
要么取这个位置要么不取这个位置,取两者的最优解。
如果我们求出每一行的最优解,再来按行来看的话还是这个问题,因此两次dp即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, m;
int mp[maxn], dp[maxn], b[maxn];
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
scanf("%d", &mp[j]);
for(int j = 1; j <= m; j++)
{
if(j == 1)
dp[j] = mp[j];
else if(j == 2)
dp[j] = max(mp[j], dp[j - 1]);
else
dp[j] = max(dp[j - 1], dp[j - 2] + mp[j]);
}
b[i] = dp[m];
}
for(int i = 1; i <= n; i++)
{
if(i == 1)
dp[i] = b[i];
else if(i == 2)
dp[i] = max(b[i], dp[i - 1]);
else
dp[i] = max(dp[i - 1], dp[i - 2] + b[i]);
}
printf("%d\n", dp[n]);
}
return 0;
}