题意:插入字符来得到回文串,求插入字符最小数目
思路:递归方程dp[i][j], 下来三者的最小值:如果str[i] 等于 str[j] 时 dp[i+1][j-1]; dp[i+1][j] + 1(在str[j]后面插入一个与str[i]相同的字符); dp[i][j-1] +1(在str[i]前面插入一个与str[j]相同的字符)。子问题填表,从(0,0)到(n, n)对角线向上填。
代码:
#include<cstdio>
using namespace std;
const int MAX = 5000;
int len;
char str[MAX+4];
short dp[MAX][MAX];
int process(){
int i, j;
int min;
for(int k=1; k<len; ++k){
for(i=0, j=k; i<len-k; ++i, ++j){
min = ((dp[i][j-1] < dp[i+1][j]) ? dp[i][j-1] : dp[i+1][j]) + 1;
if(str[i] == str[j] && min > dp[i+1][j-1])
min = dp[i+1][j-1];
dp[i][j] = min;
}
}
return dp[0][len-1];
}
int main(){
// freopen("in", "r", stdin);
int min;
while(scanf("%d", &len) != EOF){
scanf("%s", str);
min = process();
printf("%d\n", min);
}
return 0;
}