一个字符串,求最少插入几个字符可以组成回文。
典型动态规划:求该字符串和其逆字符串的最长公共子序列,用长度减去最长公共子序列长度即可。
典型动态规划:求该字符串和其逆字符串的最长公共子序列,用长度减去最长公共子序列长度即可。
wa一次:runtime error:开了一个int 5000*5000的数组(100M),超了内存64M的限制,开成short(50M)即可。
#include<iostream>
using namespace std;
short c[5001][5001];
int main()
{
char x[5001];
char y[5001];
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> x[i];
y[n-i+1] = x[i];
}
memset(c,0,sizeof(c));
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(x[i] == y[j])
c[i][j] = c[i-1][j-1] + 1;
else if(c[i][j-1] > c[i-1][j])
c[i][j] = c[i][j-1];
else
c[i][j] = c[i-1][j];
}
}
cout << n - c[n][n] << endl;
//system("pause");
}