HDU 2845 Beans (DP)
Problem DescriptionBean-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?
InputThere 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.
OutputFor each case, you just output the MAX qualities you can eat and then get.
Sample Input
4 611 0 7 5 13 978 4 81 6 22 41 40 9 34 16 1011 22 0 33 39 6
Sample Output
242
The question can be regarded as a two-dimensional solution. Each one-dimensional solution is a DP process, that is, an array. The number of I cannot be taken as the adjacent number, and the sum is the maximum.
You can set two arrays, d [I], and f [I], to indicate the sum of the values when the I number is obtained or not obtained.
D [I] = f [I-1] + a [I], f [I] = max (f [I-1], d [I-1]). F [1] = 0, d [1] = a [1].
#include
#include
#include #include
using namespace std;typedef long long LL;const int MAX=0x3f3f3f3f;const int maxn = 200005;int n, m;int d[maxn], f[maxn], a[maxn], b[maxn];int DP(int *c, int len) { d[1] = c[1], f[1] = 0; for(int i = 1; i <= len; i++) { d[i] = f[i-1] + c[i]; f[i] = max(f[i-1], d[i-1]); } return max(f[len], d[len]);}int main(){ while(~scanf("%d%d", &n, &m)) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) scanf("%d", &a[j]); b[i] = DP(a, m); } printf("%d\n", DP(b, n)); } return 0;}
Zookeeper