zoukankan      html  css  js  c++  java
  • HDU2845 DP

    Beans

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4451    Accepted Submission(s): 2103


    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
     
    题意:
    每一个格子有一个豆子,豆子有质量,每一行相邻的两个豆子不能同时选必须相隔,每一列也不能同时选,选了一列的某几个豆子则它的上一列和下一列不能选,问最多选到的豆子质量。
    代码:
     1 /*
     2 两次dp,算出每一行的最大值,再用每一行的最大值组成一列算出这列的最大值即可。
     3 */
     4 #include<iostream>
     5 #include<string>
     6 #include<cstdio>
     7 #include<cmath>
     8 #include<cstring>
     9 #include<algorithm>
    10 #include<vector>
    11 #include<iomanip>
    12 #include<queue>
    13 #include<stack>
    14 using namespace std;
    15 int n,m;
    16 int x[200000];
    17 int dp[200000][2];
    18 int a[200000];
    19 int main()
    20 {
    21     while(scanf("%d%d",&n,&m)!=EOF)
    22     {
    23         memset(x,0,sizeof(x));
    24         for(int i=1;i<=n;i++)
    25         {
    26             memset(dp,0,sizeof(dp));
    27             for(int j=1;j<=m;j++)
    28             {
    29                 scanf("%d",&a[j]);
    30             }
    31             dp[1][1]=a[1];
    32             dp[1][0]=0;
    33             for(int j=2;j<=m;j++)
    34             {
    35                 dp[j][1]=dp[j-1][0]+a[j];
    36                 dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
    37             }
    38             x[i]=max(dp[m][0],dp[m][1]);
    39         }
    40         memset(dp,0,sizeof(dp));
    41         dp[1][1]=x[1];
    42         dp[1][0]=0;
    43         for(int i=2;i<=n;i++)
    44         {
    45             dp[i][1]=dp[i-1][0]+x[i];
    46             dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
    47         }
    48         int sum=max(dp[n][1],dp[n][0]);
    49         printf("%d
    ",sum);
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    Spring bean相关
    Springboot消除switch-case方法
    Springcloud中的region和zone的使用
    SpringCloud-Eureka-服务注册是如何发起的
    SpringBoot-SpringCloud-版本对应关系
    SpringCloud-Eureka-Provider&Consumer
    激活IDEA
    搞懂spring事务
    部署spring Boot项目到tomcat
    springBoot项目打war包部署到tomcat上
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/5803044.html
Copyright © 2011-2022 走看看