Problem P13. [算法课动态规划]最长回文子串

image

动态规划的想法就是之前的状态是已经算好所有的回文子串了,然后多了一个字符,就把之前所有和最后的字符连接在一起的回文子串的前一个字符和新字符对比,如果一样,那么构成新的回文子串。
比如:babaa+b, 之前的连接到最后字符的回文子串有aa,a, aa前的b和新字符b一致,那么多了新回文子串baab。
注意:单个字符也是回文子串;dp[i][j]==1即i到j是回文子串;aaa+a连接到最后字符的回文子串有aaa,aa,a;

#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>

using namespace std;

// dp[i][j]==1即i到j是回文子串
int dp[1005][1005]={0};

int main()
{
    for (int i = 0; i < 1005; i++){
        dp[i][i]=1;
    }
    string str;
    cin >> str;
    int valmax = 1;
    int x = 0, y = 0;
    for (int i = 1; i < str.length(); i++){
        for (int j = 1; j < i; j++){
            if (dp[j][i-1]==1&&str[j-1]==str[i]){
                dp[j-1][i] = 1;
                if (i-j+1>valmax){
                    valmax = i-j+1;
                    x = j-1;
                    y = i;
                }
            }
        }
        if (str[i]==str[i-1]){
            dp[i-1][i] = 1;
            if (valmax<2){
                valmax = 2;
                x = i-1;
                y = i;
            }
        }
    }
    for (int i = x; i <= y; i++){
        printf("%c", str[i]);
    }
    return 0;
}

posted @ 2022-09-11 15:25  白缺  阅读(57)  评论(0编辑  收藏  举报