题意:给出一个字符串,然后添加最少数量的字母构建成为一个回文串,输出最少添加多少个字母,并输出新的回文串。
题解:很容易得到添加最少数量字母成为回文串,直接递归更新f[i][j]数组(从i到j的字符串最少添加数量)。然后注意输出新的回文串需要根据计算得出的f[i][j]递归输出,从左到右逐个字母输出。
#include <stdio.h>
#include <string.h>
const int N = 1005;
char str[N];
int f[N][N];
int dp(int l, int r) {
if (l >= r)
return 0;
if (f[l][r] != -1)
return f[l][r];
if (str[l] == str[r])
f[l][r] = dp(l + 1, r - 1);
else {
int temp1 = dp(l + 1, r) + 1;
int temp2 = dp(l, r - 1) + 1;
f[l][r] = temp1 < temp2 ? temp1 : temp2;
}
return f[l][r];
}
void print_ans(int l, int r) {
if (l == r) {
printf("%c", str[l]);
return;
}
if (l > r)
return;
if (str[l] == str[r]) {
printf("%c", str[l]);
print_ans(l + 1, r - 1);
printf("%c", str[r]);
return;
}
if (f[l + 1][r] < f[l][r - 1]) {
printf("%c", str[l]);
print_ans(l + 1, r);
printf("%c", str[l]);
}
else {
printf("%c", str[r]);
print_ans(l, r - 1);
printf("%c", str[r]);
}
}
int main() {
while (scanf("%s", str) != EOF) {
memset(f, -1, sizeof(f));
int len = strlen(str);
printf("%d ", dp(0, len - 1));
print_ans(0, len - 1);
printf("\n");
}
return 0;
}