POJ 1159 Palindrome

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

思路:递归方程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 ;
}

 

 

 

你可能感兴趣的:(poj)