基础
最后一天动态规划,加油!!!!
刷题
- 回文子串
这道题用bool定义dp数组,内存空间占用更少,bool占一个字节 8bit,int32占 4字节 32bit。
动规五部曲:
- 确定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
}
- 确定dp数组初始化
为了简单初始化操作,所有值都赋值为true,当s[i] != s[j], dp[i][j] = false
- 确定dp数组遍历顺序
| dp[i-1][j+1] | |
|---|---|
| dp[i][j] |
故遍历顺序为从左到右,从上到下
- 打印dp数组
- 最长回文子串
动规五部曲:
- 确定dp数组含义
dp[i][j]是 [j:i] 左闭右闭区间的字符串的最长回文子串的长度
- 确定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数组
总结
动态规划总结