Hdu 2845 Beans

Beansios

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2518    Accepted Submission(s): 1250數組

Problem Descriptionide

  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 cant 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.spa

 

 


Now, how much qualities can you eat and then get ?3d

Inputrest

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

 

Outputblog

  For each case, you just output the MAX qualities you can eat and then get.ip

 

Sample Inputci

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

 

   題目的意思是給一個矩陣,沒一點放置必定數量的豆,求出最多能吃多少個豆。可是吃豆有必定的規則,若是吃點(x,y)的豆,那麼點(x,y-1)、點(x,y+1)和點(x,y)所在行的上一行和下一行的豆都不能吃。因此咱們要作的事首先將每一行所能吃到的最大豆的數量求出來,即求出每一行非連續的最大子序列和,而後將每一行所求的最大豆數量保存到數組序列中,一樣的方法求出數組序列的非連續的最大子序列和即爲所能吃到的最大豆的數量。

  狀態轉移方程:sum[i] = dp[i-2]+a[i],dp[i] = max(sum[i],dp[i-1]),2<=i<=n,初始化sum[0]=dp[0]=0,sum[1]=dp[1]=a[1]。

個人代碼:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 #define N 200003
 5 int sum[N],dp[N],map[N],row[N];
 6 
 7 int solve(int a[],int n)
 8 {
 9     int i;
10     sum[0] = 0;
11     dp[0] = 0;
12     sum[1] = a[1];
13     dp[1] = a[1];//數組dp表明最大豆的數量
14     for(i=2; i<=n; i++)
15     {
16         sum[i] = dp[i-2]+a[i];
17         dp[i] = max(sum[i],dp[i-1]);
18     }
19     return dp[n];
20 }
21 
22 int main()
23 {
24     int i,j,n,m,sum;
25     while(scanf("%d%d",&n,&m)!=EOF)
26     {
27         for(i=1; i<=n; i++)
28         {
29             for(j=1; j<=m; j++)
30                 scanf("%d",&map[j]);
31             row[i] = solve(map,m);
32         }
33         sum = solve(row,n);
34         printf("%d\n",sum);
35     }
36     return 0;
37 }
View Code
相關文章
相關標籤/搜索