题解 | #年终奖# 动态规划

年终奖

https://www.nowcoder.com/practice/72a99e28381a407991f2c96d8cb238ab

定义dp[i][j]表示走到i行j列时能获得的最高奖金,由于只能向右走或者向下走,要求最高奖金,那么可得转移方程:

dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) + board[i][j]

即当前能获得的最大奖金为 左边和上边一格中的较大值+当前格子的值

#include <vector>
class Bonus {
  public:
    int getMost(vector<vector<int> > board) {
        vector<vector<int>> dp(6, vector<int>(6, 0));
        dp[0][0] = board[0][0];
        // 注意第一列、第一行只能选择直直走
        for (int i = 1; i < 6; i++) {
            dp[i][0] = dp[i - 1][0] + board[i][0];
        }
        for (int j = 1; j < 6; j++) {
            dp[0][j] = dp[0][j - 1] + board[0][j];
        }
        for (int i = 1; i < 6; i++) {
            for (int j = 1; j < 6; j++) {
                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]) + board[i][j];
            }
        }
        return dp[5][5];
    }
};

时间复杂度:O(1),由于题目规定了是6*6大小的格子

空间复杂度:O(1),由于题目规定了是6*6大小的格子

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务