代码随想录算法训练营day46|动态规划part12

今天就结束动态规划章节了,以后还要多加练习。

今天的两道题都很有难度,647回文子串的思路非常巧妙,因为用一维dp数组比较难表示子串的起点和终点,所以需要用二维dp数组表示,dp[i][j]表示以i为起点,j为终点的子串是不是回文子串,当s[i]和s[j]不同时,该子串不是回文子串;当s[i]==s[j]时,分类讨论:如果该子串的长度为1或2,则该子串就是回文子串,若该子串长度>2,则如果[i+1,j-1]是回文子串,则[i,j],也是回文子串;

另外要注意的一点是这题的遍历顺序,因为dp[i][j]可能由左下角的值推导而来,所以需要从下往上,从左到右推导;

516最长回文子序列看起来好像和647回文子串很不一样,因为这题不是连续的子串而是中间可以有间隔,但是递推的思想其实是差不多的。同样定义二维dp数组,dp[i][j]表示以i为起点,j为终点中最长子串的长度,所以当s[i]==s[j]时,dp[i][j]=dp[i+1][j-1]+2;当s[i]!=s[j]时,dp[i][j]就取dp[i][j-1]和dp[i+1][j]的最大值。对于初始化,因为单个的字符是回文子串,所以dp[i][i]=1,其它的部分就初始化为0。

647. 回文子串

代码随想录

516.最长回文子序列

代码随想录

动态规划总结篇

代码随想录

相关推荐
利刃大大2 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
Rachela_z3 小时前
代码随想录算法训练营第十四天| 二叉树2
数据结构·算法
细嗅蔷薇@3 小时前
迪杰斯特拉(Dijkstra)算法
数据结构·算法
追求源于热爱!3 小时前
记5(一元逻辑回归+线性分类器+多元逻辑回归
算法·机器学习·逻辑回归
ElseWhereR3 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
Smark.3 小时前
Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr
算法
S-X-S3 小时前
算法总结-数组/字符串
java·数据结构·算法
Joyner20184 小时前
python-leetcode-从中序与后序遍历序列构造二叉树
算法·leetcode·职场和发展
因兹菜4 小时前
[LeetCode]day9 203.移除链表元素
算法·leetcode·链表
LNsupermali4 小时前
力扣257. 二叉树的所有路径(遍历思想解决)
算法·leetcode·职场和发展