poj 1159 Palindrome

呃,一看到关于字符串的题就有点发怵,也不是完全因为字符串,而是对于处理字符串部署很擅长,偶尔错个小地方就要检查上半天,又是还不知道怎么错的,影响心情啊!!

这题题意是:给出一个字符串,要你求出至少添加多少个字符可以是这个串成为回文穿串。

大体思路:还是简单dp, dp[i][j] 表示从i到j至少要添加字符个数。转移方程有两种情况,一是如果str[i]== str[j] 的话,则dp[i][j]= dp[i+1][j-1] ;否则不想等的话,

dp[i][j] = min ( dp[i+1][j] , dp[i][j-1] ) + 1 ;

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxm  5003
#define maxn
using namespace std ;

int dp[2][maxm] ;

int min ( int x , int y )
{
    return x > y ? y : x ;
}

int main()
{
    int len , i , j , k ;
    char str[maxm] ;

    while ( scanf ( "%d" , &len ) != EOF )
    {
        scanf ( "%s" , str );
        memset( dp , 0 , sizeof ( dp ));

        for ( i = len - 1 ; i >= 0 ; i-- )
        {
            for ( j = i + 1 ; j < len ; j++ )
            if ( str[i] == str[j] )
            dp[i%2][j] = dp[(i+1)%2][j-1] ;
            else
            dp[i%2][j] = min ( dp[i%2][j-1] , dp[(i+1)%2][j] ) + 1 ;
        }
        printf ( "%d\n" , dp[0][len-1] );
    }
    return 0 ;
}

 

posted @ 2012-06-11 17:24  Misty_1  阅读(160)  评论(0编辑  收藏  举报