NYOJ234 吃土豆

 

吃土豆

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述
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 ?
 
输入
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<=500.
输出
For each case, you just output the MAX qualities you can eat and then get.
样例输入
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
样例输出
242
来源
2009 Multi-University Training Contest 4
 
题解:
仔细想想,其实这道题横坐标和纵坐标的状态是一样的,
对于取点(i, j):
    则在列上,不能取旁边相邻的两列,即 j-1 列和 j+1 列;
    同理,在行上,不能取旁边相邻的两行,即 i-1 行和 i+1 行。
所以,可以对行和列单独考虑:
    对于列级状态转移方程: map[i][j] = max (map[i][j-2],map[i][j-3]);
    对于行级状态转移方程: dp[i] = max(dp[i-2], dp[i-3]) + max( map[i][n-1], map[i][n]);(假定一共有n列)
参考 :http://www.cnblogs.com/A-way/archive/2013/05/08/3066236.html
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n, m;
10     int map[505][505], dp[505]; 
11     
12     while(~scanf("%d%d", &n, &m))
13     {
14         memset(map, 0, sizeof(map));
15         memset(dp, 0, sizeof(dp));
16         
17         for(int i = 3; i < n+3; ++i)
18             for(int j = 3; j < m+3; ++j)
19             {
20                 scanf("%d", &map[i][j]);
21                 map[i][j] += max(map[i][j-2], map[i][j-3]);
22             }
23         
24         for(int i = 3; i < n+3; ++i)
25             dp[i] = max(dp[i-2], dp[i-3]) + max(map[i][m+1], map[i][m+2]);
26         printf("%d\n", dp[n+2]);
27     }
28     return 0;
29 }
原文地址:https://www.cnblogs.com/dongsheng/p/3098451.html