HihoCode-1323-回文字符串

参考博客:

https://blog.csdn.net/mitsuha_/article/details/76690634

https://blog.csdn.net/u014142379/article/details/51761551

解题过程:

先看了第一位大佬的博客,了解了这题的解法,但是没看代码。这题用动态规划,dp[i][j]表示从字符串第i位到第j位最小改变次数。可以用dp[i + 1][j], dp[i][j - 1], dp[i + 1][j - 1]推出dp[i][j]。但是自己敲了代码只过了90%的数据,因为按传统循环方式for (i = 1; i <= n; i++){for (int j = 1; j <= n; j++)}的话。dp[i][j]所用到的dp[i + 1][j]和dp[i + 1][j - 1]还没有循环到。处理起来出了问题。这时候就发现第二位大佬写的代码for循环的方式很好。代码如下:

  • 动态规划
    1323 回文字符串 AC G++ 0ms 0MB
    #include "bits/stdc++.h"
    using namespace std;
    const int INF = 0x3f3f3f3f;
    char s[110];
    int dp[110][110];
    int main() {
        scanf("%s", s + 1);
        int n = strlen(s + 1);
        for (int i = n; i; i--)
        for (int j = i + 1; j <= n; j++) {
            if (s[i] == s[j]) {
                dp[i][j] = dp[i + 1][j - 1];
            } else {
                dp[i][j] = min(min(dp[i + 1][j], dp[i][j - 1]), dp[i + 1][j - 1]) + 1;
            }
        }
         printf("%d\n", dp[1][n]);
        return 0;
    }

    因为推出dp[i][j]用到的i都大于等于i,用到的j都小于等于j。所以从大到小遍历i,从小到大遍历j。当i到j的长度小于等于2时,因为dp[i + 1][j - 1]、dp[i + 1][j]、dp[i][j - 1]总是0,所以就算j > i 也不影响结果正确性。

posted @ 2019-03-01 13:17  Jathon-cnblogs  阅读(162)  评论(0编辑  收藏  举报