吃土豆

来源:互联网 发布:执业药师网络报名机构 编辑:程序博客网 时间:2024/06/10 19:38

描述
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 611 0 7 5 13 978 4 81 6 22 41 40 9 34 16 1011 22 0 33 39 6
样例输出
242

解题思路:对于每一行,即求最大不连续子序列和求得每一行的最大不连续子序列和后,根据题目要求,对于矩阵的每一行都不连续,同样是一个最大不连续子序列和的问题。

AC代码如下:

 #include <stdio.h>int a[500], b[500];int maxSubSeq(int a[], int size){    if(size == 1)        return a[0];    if(size == 2)        return a[0] > a[1] ? a[0] : a[1];    int dpi, dpi_1, dpi_2;    dpi_2 = a[0];    dpi_1 = a[0] > a[1] ? a[0] : a[1];    for(int i=2; i<size; i++)    {        int t = dpi_2 + a[i];        dpi  = t > dpi_1 ? t : dpi_1;        dpi_2 = dpi_1;        dpi_1 = dpi;    }    return dpi;}int main(){    int m, n;    while(scanf("%d %d", &m, &n) == 2)    {        for(int i=0; i<m; i++)        {            for(int j=0; j<n; j++)            {                scanf("%d", &a[j]);            }            b[i] = maxSubSeq(a, n);        }        printf("%d\n", maxSubSeq(b, m));    }    return 0;}        




原创粉丝点击