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;
}

浙公网安备 33010602011771号