代码随想录算法训练营第四十六天|动态规划part13

647. 回文子串

题目链接:647. 回文子串 - 力扣(LeetCode)

文章讲解:代码随想录

思路:

以dp【i】表示以s【i】结尾的回文子串的个数,发现递推公式推导不出来此路·不通

以dp【i】【j】表示s【i】到s【j】的回文子串的个数,递推公式也推不出

正确 dp【i】【j】表示s【i】到s【j】是否为回文串

确定递归顺序:

dp【i】【j】依赖于dp【i+1】【j-1】因此 i从后往前遍历,j从前往后遍历

则最后秩序统计矩阵上三角为true的个数

class Solution {
public:
    int countSubstrings(string s) {
        vector>dp(s.size(),vector(s.size(),false));
        int ans=0;
        for(int i=s.size()-1;i>=0;i--){    //这里实际上只修改上三角矩阵的值 
            for(int j=i;j

516.最长回文子序列

题目链接:516. 最长回文子序列 - 力扣(LeetCode)

文章讲解:代码随想录

 思路:

由于是要判断是否是回文,即要比较s【i】与s【j】显然用二维数组定义是合适的

dp[i][j]表示s【i】到s【j】的最长回文子序列的长度

推导递推公式

if(s[i]==s[j]){

j==i   dp[i][j]=1

j-i=1 dp[i][j]=2

j-i>1 dp[i][j]=dp[i+1][j-1]+2

}else{

j-i=1 dp[i][j]=1

j-i>1 dp[i][j]=dp[i+1][j-1]

注意:这里是错的 考虑bba 或者abb 这里应该是dp【i】【j】=max(dp【i】【j-1】,dp【i+1】【j】)

遍历顺序:

与上题一样 i从大到小 j从小到大

初始化:直接初始化为1

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector>dp(s.size(),vector(s.size(),1));
        int size=s.size();
        for(int i=size-1;i>=0;i--){
            for(int j=i;j1){
                        dp[i][j]=dp[i+1][j-1]+2;
                    }
                }else{
                    if((j-i)==1){
                        dp[i][j]=1;
                    }else{
                        dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
                    }
                }
            }
        }
        return dp[0][s.size()-1];
    }
};

最后一天动态规划 开心!!!!!

你可能感兴趣的:(算法,动态规划)