列表

详情


NC290. 礼物的最大价值

描述

在一个的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
如输入这样的一个二维数组,
[
[1,3,1],
[1,5,1],
[4,2,1]
]
那么路径 1→3→5→2→1 可以拿到最多价值的礼物,价值为12

示例1

输入:

[[1,3,1],[1,5,1],[4,2,1]]

输出:

12

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 1164KB, 提交时间: 2022-05-09

const static auto sync_off = []() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}
();
class Solution {
  public:
    int maxValue(vector<vector<int> >& a) {
        int n = a.size();
        int m = a[0].size();
        std::vector<vector<int> > b(n + 1, vector<int>(m + 1, 0));
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                b[i][j] = max(b[i - 1][j], b[i][j - 1]) + a[i - 1][j - 1];
            }
        }
        return b[n][m];
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 1172KB, 提交时间: 2022-04-29

const static auto sync_off = [](){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        int n = grid.size();
        int m = grid[0].size();
        std::vector<vector<int> > dp(n + 1, vector<int>(m + 1, 0));
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        return dp[n][m];
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 920KB, 提交时间: 2021-11-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        int n=grid.size()-1;
        int m=grid[0].size()-1;
        for(int i=1;i<=n;i++){
            grid[i][0]+=grid[i-1][0];
        }
        for(int i=1;i<=m;i++){
            grid[0][i]+=grid[0][i-1];
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                grid[i][j]+=max(grid[i-1][j],grid[i][j-1]);
            }
        }return grid[n][m];
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 928KB, 提交时间: 2021-11-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        int len=grid.size();
        if(0==len){
            return 0;
        }
        
        vector<long> dp(grid[0].size()+1,0);
       for(int i=0;i<len;i++){
            for(int j=0;j<grid[0].size();j++){
                dp[j+1]=max(dp[j],dp[j+1])+grid[i][j];
            }
       }
        
        return dp[grid[0].size()];
        
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 936KB, 提交时间: 2021-11-09

class Solution {
public:
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        for(int i = 1;i < grid.size(); ++i){
            grid[i][0] += grid[i-1][0];
        }
        for(int j = 1;j < grid[0].size(); ++j){
            grid[0][j] += grid[0][j-1];
        }

        for(int i = 1;i < grid.size(); ++i)
            for(int j = 1;j < grid[0].size(); ++j){
                grid[i][j] += max(grid[i-1][j], grid[i][j-1]);
                
            }
        
        return grid[grid.size()-1][grid[0].size()-1];
    }
};








上一题