美文网首页
动态规划

动态规划

作者: 每皮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