Beans

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.
SampleInput
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
SampleOutput
242

题意:在图中取数,例如取了81之后,同一行的相邻两个不能取,还有81的上面那行和下面那行也不能取,问能取到的最大和是多少?

 

解析:对于一行来说,相邻的数不可同时取,

容易得到状态转移方程:sum[i] = max (sum[i-2]+sum[i], sum[i-1])(i>=2,注意i从1开始,i-2=0时不存在sum[i-2]相当于只取sum[i]),初始时sum[0] = 0, sum[i]就是第i个数

而对于一列来说,显然的也是相邻的不能取,所以对每一行处理完后再用每行得到结果组成一列进行同样处理即可得出答案

 1 #include <iostream>
 2 using namespace std;
 3 #define M 200005
 4 
 5 int a[M], b[M];
 6 
 7 int main()
 8 {
 9     int m, n, i, j;
10     while (~scanf ("%d%d", &m, &n))
11     {
12         for (i = 1; i <= m; i++)
13         {
14             for (j = 1; j <= n; j++)
15                 scanf ("%d", b+j);
16             for (j = 2; j <= n; j++)
17                 b[j] = max (b[j-2]+b[j], b[j-1]);
18             a[i] = b[n];
19         }
20         for (i = 2; i <= m; i++)
21             a[i] = max (a[i]+a[i-2], a[i-1]);
22         printf ("%d\n", a[m]);
23     }
24     return 0;
25 }
View Code

 

posted @ 2015-10-19 10:31  Wei_java  阅读(249)  评论(0编辑  收藏  举报