区间dp

作者: 来到了没有知识的荒原 | 来源:发表于2023-04-07 15:14 被阅读0次

灵茶山艾府视频

516. 最长回文子序列

class Solution(object):
    def longestPalindromeSubseq(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = len(s)
        f = [[0] * n for _ in range(n)]
        for i in range(n):
            f[i][i] = 1
        for l in range(2, n + 10):
            for i in range(n):
                j = i + l - 1
                if j >= n:
                    break
                if s[i] == s[j]:
                    f[i][j] = max(f[i][j], f[i + 1][j - 1] + 2)
                else:
                    f[i][j] = max(f[i + 1][j], f[i][j - 1])
        return f[0][n - 1]

1039. 多边形三角剖分的最低得分

状态转移函数:

加了@cache就是记忆化了...太叼了
dfs是自顶向下,这个会比较好想

class Solution:
    def minScoreTriangulation(self, v: List[int]) -> int:
        n = len(v)
        @cache
        def dfs(i, j):
            if i + 1 == j:
                return 0
            res = 1e9
            for k in range(i + 1, j):
                res = min(res, dfs(i, k) + dfs(k, j) + v[i] * v[j] * v[k])
            return res
        return dfs(0, n - 1)

# 状态有O(n^2)个,计算每个状态需要O(n),所以总体复杂度是O(n^3)

自底向上的递推,用len从小到大,确定i之后,右端点j = i + len - 1
跟视频里灵神写法不一样

class Solution:
    def minScoreTriangulation(self, v: List[int]) -> int:
        n = len(v)
        f = [[0] * n for _ in range(n)]

        for l in range(3, n + 2):
            for i in range(n):
                j = i + l - 1
                if j >= n:
                    break
                f[i][j] = 1e9
                for k in range(i + 1, j):
                    f[i][j] = min(f[i][j], f[i][k] + f[k][j] + v[i] * v[j] * v[k])
        return f[0][n - 1]

相关文章

  • 「动态规划」例题之状态和转移方程的设计(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背包) 例子:线性动规:拦截导弹,...

  • DP模板之---区间DP

    一.经典例题 题目地址: 【P1880】[NOI1995]石子合并 - 洛谷 二.分析 转移方程 dp_max[i...

  • LeetCode 区间dp

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

  • 区间dp入门

    题目:洛谷P1040加分二叉树[https://www.luogu.com.cn/problem/P1040]大意...

网友评论

      本文标题:区间dp

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