POJ 1159 Palindrome yongmou

题意:插入字符来得到回文串,求插入字符最小数目

思路:递归方程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;
}
原文地址:https://www.cnblogs.com/liyongmou/p/1774022.html