CQUOJ 2732 - Beans
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
/* 2016年5月19日00:40:23 题意:在图中取数,例如取了81之后,同一行的相邻两个不能取, 还有81的上面那行和下面那行也不能取,问能取到的最大和是多少? 状态转移方程:sum[i] = max (sum[i-2]+sum[i], sum[i-1]) */ # include <iostream> # include <algorithm> # include <cstdio> # include <cstring> # include <queue> # include <vector> # include <cmath> # include <map> # include <set> # define pi acos(-1) # define LL long long # define INF 0x3f3f3f3f using namespace std; const int N = 2e5 + 5; int a[N], b[N]; int dp[N]; int main(void) { int n, m, i, j; while(~scanf("%d %d", &n, &m)){ dp[0] = 0; for (i = 1; i <= n; i++){ for (j = 1; j <= m; j++) scanf("%d", &a[j]); dp[1] = a[1]; for (j = 2; j <= m; j++) dp[j] = max(dp[j-1], dp[j-2]+a[j]); b[i] = dp[m]; } dp[1] = b[1]; for (i = 2; i <= n; i++){ dp[i] = max(dp[i-1], dp[i-2]+b[i]); } cout<<dp[n]<<endl; } return 0; }

浙公网安备 33010602011771号