zoukankan      html  css  js  c++  java
  • hdu 2845 Beans(DP)

    题意:

    M*N的矩阵,每个格子上有一个值。

    规则:如果你拾起了某个格子(i,j)上的值,那么第i-1行、第i+1行、(i,j-1)格子上、(i,j+1)格子上的值都不能取。

    问最多可以取得多少值(最大值)。

    思路:

    如果某行取了某一个值,则它的前一行和后一行都不能取。所以我们必须知道这行可以取得的最大值是多少。

    dp[i]=max( dp[i-1],dp[i-2]+a[i] )  dp[i]:前i个数能获得的最大值。第i个可以取,可以不取。

    当每行的dp[N]都算出来后,可以发现从行的角度看,dp方程也是一样的!

    看代码

    代码:

    int a[200005], b[200005];
    int dp1[200005], dp[200005];
    int m,n;
    
    
    int main(){
    
        while(scanf("%d%d",&m,&n)!=EOF){
            mem(dp1,-inf);
            mem(dp,-inf);
            mem(b,-inf);
    
            rep(i,1,m){
                rep(j,1,n){
                    scanf("%d",&a[j]);
                }
                dp1[1]=a[1];    dp1[2]=max(a[1],a[2]);
                rep(j,3,n) dp1[j]=max( dp1[j-2]+a[j],dp1[j-1] );
                rep(j,1,n) b[i]=max( b[i],dp1[j] );
            }
            dp[1]=b[1];     dp[2]=max(b[1],b[2]);
            rep(i,3,m) dp[i]=max( dp[i-2]+b[i],dp[i-1] );
            int ans=-inf;
            rep(i,1,m) ans=max( ans,dp[i] );
            printf("%d
    ",ans);
        }
    
        return 0;
    }
  • 相关阅读:
    SWFUpload说明文档
    Ubuntu中root用户和user用户的相互切换
    不用IF比较两数大小
    Linux服务器下验证码图片不显示问题
    常用CSS语法
    常用CSS语法
    漫谈DataList的用法
    Session丢失浅析
    浅谈C#托管程序中的资源释放问题
    C#2.0 泛型详解
  • 原文地址:https://www.cnblogs.com/fish7/p/4246697.html
Copyright © 2011-2022 走看看