• UVa 10739 String to Palindrome


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

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int MAXN = 1000 + 10;
     5 
     6 char str[MAXN];
     7 int map[MAXN][MAXN];
     8 
     9 int min( int a, int b )
    10 {
    11     return a < b ? a : b;
    12 }
    13 
    14 int DP( int x, int y )
    15 {
    16     if ( x >= y ) return 0;
    17     else if ( map[x][y] != -1 ) return map[x][y];
    18     else
    19     {
    20         if ( str[x] == str[y] )
    21            map[x][y] = DP(x + 1, y - 1);
    22         else
    23         {
    24             int temp1 = DP( x, y - 1 );
    25             int temp2 = DP( x + 1, y );
    26             int temp3 = DP( x + 1, y - 1 );
    27             map[x][y] = min( min(temp1, temp2), temp3 ) + 1;
    28         }
    29         return map[x][y];
    30     }
    31 }
    32 
    33 int main()
    34 {
    35     int T;
    36     scanf( "%d", &T );
    37     for ( int tt = 1; tt <= T; tt++ )
    38     {
    39         scanf( "%s", str );
    40         int len = strlen(str);
    41 
    42         memset(map, -1, sizeof(map) );
    43         printf( "Case %d: %d\n", tt, DP( 0, len-1 ) );
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    文件操作
    苹果越狱
    猫的期幻之旅-20130114
    js传url中文参数乱码问题
    JS三元
    SQL同列合并
    数据库引擎介绍innodb和myisam
    数据库优化
    gleez 下分页功能优化
    kohana安装总结
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2612545.html
Copyright © 2020-2023  润新知