Day46 动态规划 Part13

32 阅读1分钟

基础

最后一天动态规划,加油!!!!

刷题

  1. 回文子串

leetcode.cn/problems/pa…

image.png

这道题用bool定义dp数组,内存空间占用更少,bool占一个字节 8bit,int32占 4字节 32bit。

image.png

动规五部曲:

  • 确定dp数组含义

dp[i][j] 是 [j:i] 左闭右闭字符串是否是回文子串

  • 确定dp数组递推公式
if s[i] == s[j] {
    dp[i][j] = dp[i-1][j+1]
    // 这里当i-j <=1, 也就是i,j相邻,例如aa
    // 就需要找dp[i-1][j+1], 这是个不存在的值,但是当这种情况发生,dp[i][j]需要赋值为true
    // 故对于j>i 的情况,全部赋值为true
}else {
    dp[i][j] = false
}

IMG_3407.HEIC

  • 确定dp数组初始化

为了简单初始化操作,所有值都赋值为true,当s[i] != s[j], dp[i][j] = false

  • 确定dp数组遍历顺序
dp[i-1][j+1]
dp[i][j]

故遍历顺序为从左到右,从上到下

  • 打印dp数组
  1. 最长回文子串

leetcode.cn/problems/lo…

image.png

动规五部曲:

  • 确定dp数组含义

dp[i][j]是 [j:i] 左闭右闭区间的字符串的最长回文子串的长度

IMG_3408.HEIC

  • 确定dp数组递推公式
if s[i] == s[j] {
    dp[i][j] = dp[i-1][j+1]
}else {
    dp[i][j] = max(dp[i-1][j], dp[i][j+1])
    // 这里当s[i] != s[j] 
    // 可以考虑删除头,也就是dp[i][j+1]
    // 可以开绿删除尾,即 dp[i-1][j]
}

  • 确定dp数组初始化

dp[i][i] = 1

//其余都是0

  • 确定dp数组遍历顺序

从上到下,从右往左

  • 打印dp数组

总结

动态规划总结

programmercarl.com/%E5%8A%A8%E…