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;
题目:给定一个字符串,可以进行 添加任意一个字符,删除任意一个字符,替换任意位置的一个字符变为任意另一个字符 这三种操作,求使得该字符串变成回文串最少操作步数。
添加一个字符与删除一个字符等效,因此只考虑添加。
递推公式: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; }
相关文章推荐
- UVa 10739 String to Palindrome(经典回文串区间DP)
- UVA 10739 - String to Palindrome
- UVa 10739 - String to Palindrome
- UVA 10739--String to Palindrome +dp
- UVA 10739 String to Palindrome 转换回文 dp递推
- uva 10739 - String to Palindrome
- UVA - 10739 String to Palindrome
- uva10739(String to Palindrome)
- UVA 题目10739 String to Palindrome(区间DP)
- uva 10739 String to Palindrome
- UVa 10739 String to Palindrome String to Palindrome
- uva 10739 - String to Palindrome(带增删改操作的回文串问题)
- uva10739 - String to Palindrome(简单动归)
- uva 10739 String to Palindrome(dp)
- UVA 10739 String to Palindrome
- UVa 10739 - String to Palindrome
- UVA 10739 String to Palindrome(dp)
- uva 10739 String to Palindrome
- UVA 10739 String to Palindrome
- UVA 10739 - String to Palindrome