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 ; }