• [剑指Offer]47-礼物的最大价值(DP)


    题目描述

    在一个m*n的棋盘每个格有一个礼物,每个礼物有一定价值(>0)。从棋盘左上角到右下角,只能向下或向右走,问能拿到的礼物最大价值。

    解题思路

    dp。
    可将二维数组版优化为一维数组版。

    代码

    一维数组版

    #include <iostream>
    using namespace std;
    
    int maxSum(int* val,int rows,int cols){
        if(!val||rows<=0||cols<=0){
            return -1;
        }
        
        int dp[cols];
        memset(dp, 0, sizeof(dp));
        
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(i==0&&j==0){
                    dp[j]=val[i*cols+j];
                }
                else if(i==0){
                    dp[j]=dp[j-1]+val[i*cols+j];
                }
                else if(j==0){
                    dp[j]=dp[j]+val[i*cols+j];
                }
                else{
                    dp[j]=max(dp[j],dp[j-1])+val[i*cols+j];
                }
            }
        }
        return dp[cols-1];
    }
    
    int main(int argc, const char * argv[]) {
        int val[]={1,2,3,4,5,6};
        int rows=2;
        int cols=3;
        int* pVal=val;
        int sum=maxSum(pVal, rows, cols);
        cout<<sum<<endl;
        return 0;
    }
    
    

    二维数组版

    #include <iostream>
    using namespace std;
    
    int maxSum(int* val,int rows,int cols){
        if(!val||rows<=0||cols<=0){
            return -1;
        }
        
        int dp[rows][cols];
        memset(dp, 0, sizeof(dp));
        
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                if(i==0&&j==0){
                    dp[i][j]=val[i*cols+j];
                }
                else if(i==0){
                    dp[i][j]=dp[i][j-1]+val[i*cols+j];
                }
                else if(j==0){
                    dp[i][j]=dp[i-1][j]+val[i*cols+j];
                }
                else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])+val[i*cols+j];
                }
            }
        }
        return dp[rows-1][cols-1];
    }
    
    int main(int argc, const char * argv[]) {
        int val[]={1,2,3,4,5,6};
        int rows=2;
        int cols=3;
        int* pVal=val;
        int sum=maxSum(pVal, rows, cols);
        cout<<sum<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    WCF 、Web API 、 WCF REST 和 Web Service 的区别
    BusyIndicator using MVVM 忙碌状态指示器的的实现
    复制文件夹的方法 .net
    SQL/LINQ/Lamda
    CSLA验证规则总结
    C++中GB2312字符串和UTF-8之间的转换
    如何用VC编写供PB调用的DLL
    【转】lucene4.3.0 配置与调试
    cygwin主要命令
    【转】eclipse中window->preference选项中没有tomcat的解决方法
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10536407.html
Copyright © 2020-2023  润新知