2312. 卖木头块 【动态规划,多种情形更新状态】

11 阅读1分钟

2312. 卖木头块

class Solution:
    def sellingWood(self, m: int, n: int, prices: List[List[int]]) -> int:
        # dp[i][j]: 切割一块 高【宽】为 i   宽【长】为 j  能获得 的最多 钱数
        # 直接 售卖 收益 为 price 
        # 竖切  切割 位置为 k  [1 - j-1]  两个 高为 i ,宽为 k  j - k  f[i][k] + f[i][j-k]
        # 横切 切割位置 为 k  得到两个 宽为 j, 高为 k i-k    f[k][j] + f[i-k][j]
        dp = [[0] * (n + 1) for _ in range(m + 1)]
        for h, w, p in prices:
            dp[h][w] = p 

        for i in range(1, m + 1):  
            for j in range(1, n + 1):
                # 讨论 切割情况
                for k in range(1, j//2 + 1): # 竖切
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[i][j - k])
                for k in range(1, i//2 + 1): # 横切
                    dp[i][j] = max(dp[i][j], dp[k][j] + dp[i - k][j])

        return dp[m][n]        

image.png

class Solution {
public:
    long long sellingWood(int m, int n, vector<vector<int>>& prices) {
        vector<vector<long long>> dp(m + 1, vector<long long>(n + 1));
        for (auto p : prices){
            dp[p[0]][p[1]] = p[2];
        }

        for (int i = 1; i <= m; ++i){
            for (int j = 1; j <= n; ++j){
                // 讨论 切割情况
                for (int k = 1; k <= j / 2; ++k){// 竖切
                    dp[i][j] = max(dp[i][j], dp[i][k] + dp[i][j - k]);
                }             
                for (int k = 1; k <= i / 2; ++k){//横切
                    dp[i][j] = max(dp[i][j], dp[k][j] + dp[i - k][j]);
                }
            }
        }
        return dp[m][n];        
    }
};