!-- Loading 底层遮罩 -->

P1435 回文子串

传送门

思路

题目要求插入的字符最少,可以转化为求解串中最长子回文串的问题,除了最长子回文串以外其他字符都需要插入字符来形成回文。由于回文特性,可以把求解最长子回文串的问题转化为求串与逆序串的LCS。

另一种思路是定义状态 dp[ i ][ j ] 为字符串第 i 个位置到第 j 个位置需要插入的最少字符,当S[ i ]==S[ j ]时不需要额外插入,转移为 dp[ i ][ j ] = dp[ i+1][ j−1],否则,需要在左端或者右端插入字符,转移为 dp[ i ][ j ] = min( dp[ i + 1][ j ],dp[ i ][ j−1] ) + 1。

代码

#include<iostream>
#include<cstring>
using namespace std;
string s1, s2;
int dp[1007][1007];
int main(void)
{
    cin >> s1;
    for (int i = s1.size() - 1; i >= 0; i--)
        s2 += s1[i];
    for (int i = 1; i <= s1.size(); i++)
    {
        for (int j = 1; j <= s2.size(); j++)
        {
            dp[i][j] = max(max(dp[i - 1][j], dp[i][j - 1]),
                dp[i - 1][j - 1] + (s1[i - 1] == s2[j - 1]));
        }
    }
    cout << s1.size() - dp[s1.size()][s2.size()];
    return 0;
}

 

posted @ 2022-03-30 20:08  Thinker-X  阅读(32)  评论(0)    收藏  举报