您的位置:首页 > 其它

UVa 10739 - String to Palindrome

2012-07-27 22:18 323 查看
跟UVa 10453 一个类型的题。

题目:给定一个字符串,可以进行 添加任意一个字符,删除任意一个字符,替换任意位置的一个字符变为任意另一个字符 这三种操作,求使得该字符串变成回文串最少操作步数。

添加一个字符与删除一个字符等效,因此只考虑添加。

递推公式:dp[x][y]代表位置x到位置y的字符串变成回文串的最小操作数

if ( str[x]==str[y] ) dp[x][y] = dp[x+1][y-1];

else dp[x][y] = min(dp[x+1][y], dp[x][y-1], dp[x+1][y-1]) + 1;

#include <cstdio>
#include <cstring>

const int MAXN = 1000 + 10;

char str[MAXN];
int map[MAXN][MAXN];

int min( int a, int b )
{
return a < b ? a : b;
}

int DP( int x, int y )
{
if ( x >= y ) return 0;
else if ( map[x][y] != -1 ) return map[x][y];
else
{
if ( str[x] == str[y] )
map[x][y] = DP(x + 1, y - 1);
else
{
int temp1 = DP( x, y - 1 );
int temp2 = DP( x + 1, y );
int temp3 = DP( x + 1, y - 1 );
map[x][y] = min( min(temp1, temp2), temp3 ) + 1;
}
return map[x][y];
}
}

int main()
{
int T;
scanf( "%d", &T );
for ( int tt = 1; tt <= T; tt++ )
{
scanf( "%s", str );
int len = strlen(str);

memset(map, -1, sizeof(map) );
printf( "Case %d: %d\n", tt, DP( 0, len-1 ) );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: