美文网首页
LeetCode 区间dp

LeetCode 区间dp

作者: 来到了没有知识的荒原 | 来源:发表于2020-08-26 11:13 被阅读0次

1553. 吃掉 N 个橘子的最少天数

class Solution {
public:
    int minCost(int n2, vector<int> &cuts) {
        vector<int> s;
        sort(cuts.begin(),cuts.end());
        cuts.push_back(n2);
        s.push_back(0);
        for (auto i:cuts) {
            s.push_back(i);
        }

        const int N = 200;
        int n = s.size() - 1;
        int f[N][N];
        memset(f, 0, sizeof f);

        for (int len = 2; len <= n; len++)  // 先从小到大循环区间长度
            for (int i = 1; i + len - 1 <= n; i++)  // 再从左端点开始
            {
                int l = i, r = i + len - 1;
                f[l][r] = 1e8;
                for (int k = l; k < r; k++)   // 再枚举决策
                    f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
            }
        return f[1][n];
    }
};

5498. 石子游戏 V

class Solution {
public:
    int dp[501][501]; // 记忆化数组,用于避免重复计算
    int sum[501];

    int dfs(int l, int r) {
        if(dp[l][r] != -1) { //已经计算过该子问题了,直接范围答案
            return dp[l][r];
        }
        if(l == r) { // 终止条件,直接获得答案
            dp[l][r] = 0;
        } else {
            //递进阶段,根据题意,求解最大值;
            int val = 0;
            for(int i = l; i< r; i++) {
                int s1 = sum[i] - sum[l-1];
                int s2 = sum[r] - sum[i];

                if(s1 < s2) { // 根据题意,只能取后半段
                    val = max(val, s1 + dfs(l, i));
                } else if(s1 > s2){ // 根据题意,只能取前半段
                    val = max(val, s2 + dfs(i+1, r));
                } else { // 相等时,可任意选择~
                    val = max(dfs(l, i), dfs(i+1, r)) + s1;
                }
            }
            //回归阶段,更新答案
            dp[l][r] = val;
        }
        return dp[l][r];
    }

    int stoneGameV(vector<int>& stoneValue) {
        memset(dp, -1, sizeof(dp));

        //出来一下前缀和
        sum[0] = 0;
        for(int i = 0; i < stoneValue.size(); i++) {
            sum[i+1] = sum[i] + stoneValue[i];
        }

        return dfs(1, stoneValue.size());
    }
};

相关文章

  • LeetCode 区间dp

    1553. 吃掉 N 个橘子的最少天数 5498. 石子游戏 V

  • 「动态规划」例题之状态和转移方程的设计(2)

    0x50「动态规划」例题 区间DP 线性DP从初态开始,沿着“阶段”向某个方向扩张。而区间DP是线性DP的一种,它...

  • 区间类DP总结

    区间类DP的做法,是用memorized search,把大区间拆分为小区间来解。而dp[i][j] 则直观的表示...

  • 区间DP和回文为主题的DP

    区间DP 区间DP的特征: 可以两个或多个部分进行整合, 或者反过来;能将问题分解为能两两合并的形式.区间DP的求...

  • 区间DP

    区间DP,对于每段小区间,它的最优值是由更小的区间的最优值得出的,由此往下划分,直到单个元素,由他们的组合合并得出...

  • 区间DP

    模板区间dp一般由小区间推出大的区间: http://acm.hdu.edu.cn/showproblem.php...

  • 区间DP

    石子合并 原题链接[https://www.acwing.com/problem/content/284/] 2....

  • DP小结

    DP种类 线性DP 区间DP 树形DP 背包DP01背包满背包完全背包(转成01背包) 例子:线性动规:拦截导弹,...

  • 221. Maximal Square

    LeetCode Link 题解方式 DP

  • [leetcode]Guess Number Higher or

    看到leetcode官微说他们又更新题啦,点开一看,简单dp嘛。f[L][R]表表示猜[L, R]这个区间里面的数...

网友评论

      本文标题:LeetCode 区间dp

      本文链接:https://www.haomeiwen.com/subject/ldfwjktx.html