zoukankan      html  css  js  c++  java
  • hihocoder 1323 回文字符串(字符串+dp)

    题解:

    比较水的题目

    dp[i][j]表示[i...j]最少改变几次变成回文字符串

    那么有三种转移

    dp[i][j] = dp[i+1][j-1] + s[i] != s[j]

    dp[i][j] = dp[i+1][j] + 1(删除左边的字符,或者在右边添加一个字符与左边匹配)

    dp[i][j] = dp[i][j-1] + 1(删除右边的字符,或者在左边添加一个字符与右边匹配)

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    char S[110];
    int dp[110][110];
    int dfs(int i, int j){
        if(i >= j) return 0;
        if(dp[i][j] < 100) return dp[i][j];
        dp[i][j] = min(dp[i][j], dfs(i+1, j) + 1);
        dp[i][j] = min(dp[i][j], dfs(i, j-1) + 1);
        dp[i][j] = min(dp[i][j], dfs(i+1, j-1) + (S[i] != S[j]));
        return dp[i][j];
    }
    
    int main()
    {
        while(cin>>S){
            int n = strlen(S);
            memset(dp, 1, sizeof(dp));
            cout<<dfs(0, n-1)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Java五
    Java I/O流
    第二周学习笔记
    第一周学习笔记
    第六次作业修改版
    第六周作业
    java第四次作业(补)
    java第五次作业
    Java第三次作业
    java第二次作业
  • 原文地址:https://www.cnblogs.com/Saurus/p/7374758.html
Copyright © 2011-2022 走看看