美文网首页
动态规划

动态规划

作者: 每皮1024 | 来源:发表于2022-07-24 16:17 被阅读0次

    前言

    动态规划是通过以空间换时间的一种方式。
    这种类型的题目就我个人而言不是特别的熟练,每次都需要刷些题找找感觉,因为它的关键是要找到初始状态和状态转移方程。

    题目

    一、22. 括号生成

    // https://leetcode.cn/problems/generate-parentheses/solution/zui-jian-dan-yi-dong-de-dong-tai-gui-hua-bu-lun-da/
    /*
        参考 lambda 的 go 版本
        1. 当我们要给出n个括号对组成的结果集 f(n)时,在这个结果中,所有字符串的第一个元素必然是 "("
        2. 那么必然有另一个与之匹配的右括号 ")"
        3. 那么还有 n-1 个括号对需要安放
        4. 这 n-1 个括号对中,可以有 j 个括号对位于上述这对括号的内部,那么剩余的 n-1-j 个括号对都在上述括号对右侧
        5. j的取值范围应该是 [0, n-1]
        6. 所以在计算f(n)时, 我们是需要知道 f(0), f(1), ... f(n-1)的结果的,因此需要用map保存dp过程中的每一个结果
    */
    func generateParenthesis(n int) []string {
        return dp(n)[n]
    }
    
    func dp(n int) map[int][]string {
        if n == 0 {
            return map[int][]string{0: {""}}
        }
        if n == 1 {
            return map[int][]string{0: {""}, 1: {"()"}}
        }
        lastMap := dp(n - 1)
        var oneRes []string
        for i := 0; i < n; i++ {
            inners := lastMap[i]
            outers := lastMap[n-1-i]
            for _, inner := range inners {
                for _, outer := range outers {
                    oneRes = append(oneRes, "("+inner+")"+outer)
                }
            }
        }
        lastMap[n] = oneRes
        return lastMap
    }
    

    相关文章

      网友评论

          本文标题:动态规划

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