• UVa 10739 String to Palindrome(经典回文串区间DP)


    题意:

    给定一个字符串,可以对其进行删除,插入,替换操作。

    问最少经过几次操作,可以使这个字符串变成回文字符串。

    思路:

    类似于以前的只能进行插入/删除操作的回文字符串,这次多了一个替换操作,于是就有了下面的几种情况:

    (区间DP即是不断向两侧扩大规模)

    1. s[i] == s[j] 显然只需要考虑i与j之间的字符串即可,此时dp[i][j] = dp[i+1][j-1]。

    2. s[i] != s[j] 这时就要考虑到底是删除,插入还是替换。由于删除和插入所需要的操作步数以及影响是一致的,

       只需要考虑插入或者删除就行了。对于插入则dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1;对于替换则有dp[i][j] = min(dp[i][j], dp[i+1][j-1] + 1);

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    
    #define min(a,b) (((a) < (b)) ? (a) : (b))
    
    const int MAXN = 1010;
    char str[MAXN];
    int dp[MAXN][MAXN];
    
    int main()
    {
        int cases, cc = 0;
        scanf("%d", &cases);
        while (cases--)
        {
            scanf("%s", str);
            int n = strlen(str);
            for (int i = 0; i < n; ++i)
            {
                dp[i][i] = 0;
                if (str[i] == str[i+1])
                    dp[i][i+1] = 0;
                else
                    dp[i][i+1] = 1;
            }
    
            for (int p = 2; p < n; ++p)
            {
                for (int i = 0, j = p; j < n; ++i, ++j)
                {
                    if (str[i] == str[j])
                        dp[i][j] = dp[i+1][j-1];
                    else
                    {
                        dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1;
                        dp[i][j] = min(dp[i][j], dp[i+1][j-1] + 1);
                    }
                }
            }
            printf("Case %d: %d\n", ++cc, dp[0][n-1]);
        }
        return 0;
    }

     

    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    从一个网页上摘取想要的元素
    Oracle数据库迁移
    java 内部类
    关于robot framework 环境搭建的几点注意
    robotframework 页面已经locate到元素 但是操作提示element is no longer valid!
    转 PyQt学习资料
    Java 大数值
    【转】Excel 使用技巧
    Java调用WebService
    String StringBuffer StringBuider
  • 原文地址:https://www.cnblogs.com/kedebug/p/2777249.html
Copyright © 2020-2023  润新知