程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2845 Beans

HDU 2845 Beans

編輯:C++入門知識

Beans
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1945 Accepted Submission(s): 984

 

Problem 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.


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

Source
2009 Multi-University Training Contest 4 - Host by HDU


Recommend
gaojie
 這題目是DP,DP自己獨立做出來的次數不多,而這次是獨立做出來的,哈哈哈,有點欣喜
其實這題分析後就會發現 可以先求整行的最大值用dp,知道每行的的最大值後在求整體的最大值用DP。其思路是一樣的。 求行的最大值公式 0代表不選,1代表選
dp[j][0] = max(dp[j-1][1],dp[j-1][0]);
dp[j][1] = max(dp[j-2][0],dp[j-2][1]);
val=max(dp[j][0],dp[j][1]);
同樣的方法處理整體。 注意處理邊界啊
[cpp]  /***************************************************************
    > File Name:    a.cpp
    > Author:       SDUT_GYX
    > Mail:         [email protected]
    > Created Time: 2013/5/23 23:48:46
 **************************************************************/ 
 
#include <iostream>  
#include <cstring>  
#include <algorithm>  
#include <cstdio>  
#include <queue>  
#include <cstdlib>  
#include <iomanip>  
#include <string>  
#include <vector>  
#include <map>  
#include <cmath>  
#include <stack>  
#define LL long long  
using namespace std; 
int a[210000],dp_row[210000][2],dp_col[210000][2]; 
int main() 

  // freopen("data1.in","r",stdin);  
    int n,m; 
    while(scanf("%d %d",&n,&m)!=EOF) 
    { 
        for(int i=0;i<=n-1;i++) 
        { 
            for(int j=0;j<=m-1;j++) 
            { 
                 int x=i*m+j;  
                scanf("%d",&a[x]); 
            } 
        } 
        int val,res=0; 
        for(int i=0;i<=n-1;i++) 
        { 
            val=0; 
            for(int j=0;j<=m-1;j++) 
            { 
                 int x=i*m+j;  
                if(j==0) 
                { 
                     dp_row[j][0] = 0; 
                     dp_row[j][1]  = a[x]; 
                    val = max(val,dp_row[j][1]); 
                    continue; 
                }else if(j==1) 
                { 
                    dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]); 
                    dp_row[j][1] = a[x]; 
                    val = max(val,dp_row[j][0]); 
                    val = max(val,dp_row[j][1]); 
                    continue; 
                } 
                dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]); 
                dp_row[j][1] = max(dp_row[j-2][0], dp_row[j-2][1]) +a[x]; 
                val = max(val,dp_row[j][0]); 
                val = max(val,dp_row[j][1]); 
            } 
            if(i==0) 
            { 
                dp_col[i][0] = 0; 
                dp_col[i][1] = val; 
                res = max(res,dp_col[i][1]); 
                continue; 
            }else if(i==1) 
            { 
                dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]); 
                dp_col[i][1] = val; 
                res = max(res,dp_col[i][1]); 
                res = max(res,dp_col[i][0]); 
                continue; 
            } 
            dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]); 
            dp_col[i][1] = max(dp_col[i-2][0],dp_col[i-2][1]) + val; 
            res = max(res,dp_col[i][0]); 
            res = max(res,dp_col[i][1]); 
        } 
        printf("%d\n",res); 
    } 
    return 0; 

/***************************************************************
    > File Name:    a.cpp
    > Author:       SDUT_GYX
    > Mail:         [email protected]
    > Created Time: 2013/5/23 23:48:46
 **************************************************************/

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <stack>
#define LL long long
using namespace std;
int a[210000],dp_row[210000][2],dp_col[210000][2];
int main()
{
  // freopen("data1.in","r",stdin);
    int n,m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=0;i<=n-1;i++)
        {
            for(int j=0;j<=m-1;j++)
            {
                 int x=i*m+j;
                scanf("%d",&a[x]);
            }
        }
        int val,res=0;
        for(int i=0;i<=n-1;i++)
        {
            val=0;
            for(int j=0;j<=m-1;j++)
            {
                 int x=i*m+j;
                if(j==0)
                {
      dp_row[j][0] = 0;
                     dp_row[j][1]  = a[x];
                    val = max(val,dp_row[j][1]);
                    continue;
                }else if(j==1)
    {
     dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
     dp_row[j][1] = a[x];
     val = max(val,dp_row[j][0]);
     val = max(val,dp_row[j][1]);
     continue;
    }
    dp_row[j][0] = max(dp_row[j-1][0],dp_row[j-1][1]);
    dp_row[j][1] = max(dp_row[j-2][0], dp_row[j-2][1]) +a[x];
    val = max(val,dp_row[j][0]);
    val = max(val,dp_row[j][1]);
            }
   if(i==0)
   {
    dp_col[i][0] = 0;
    dp_col[i][1] = val;
    res = max(res,dp_col[i][1]);
    continue;
   }else if(i==1)
   {
    dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
    dp_col[i][1] = val;
    res = max(res,dp_col[i][1]);
    res = max(res,dp_col[i][0]);
    continue;
   }
   dp_col[i][0] = max(dp_col[i-1][0],dp_col[i-1][1]);
   dp_col[i][1] = max(dp_col[i-2][0],dp_col[i-2][1]) + val;
   res = max(res,dp_col[i][0]);
   res = max(res,dp_col[i][1]);
        }
        printf("%d\n",res);
    }
    return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved