zoukankan      html  css  js  c++  java
  • POJ1159 Palindrome(dp)

    题目链接

    分析:

    感叹算法的力量。

    方法一:

    设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数。

    那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1.

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <map>
    
    using namespace std;
    
    const int maxn = 5000;
    
    short dp[maxn][maxn];
    char s[maxn];
    
    int d(int i, int j) {
        if(i >= j) return 0;
        else if(dp[i][j] != -1) return dp[i][j];
        else if(s[i] != s[j]) return (dp[i][j] = min(d(i+1, j), d(i, j-1)) + 1);
        else return dp[i][j] = d(i+1, j-1);
    }
    
    int main(){
      //  freopen("my.txt", "r", stdin);
        int n;
        while(scanf("%d", &n) == 1) {
            memset(dp, -1, sizeof(dp));
    
            scanf("%s", s);
            d(0, n-1);
            printf("%d
    ", dp[0][n-1]);
        }
    
        return 0;
    }
    View Code

    方法二:

    LCS + 滚动数组.

    设原序列S的逆序列为S',

    最少需要补充的字母数 = 原序列S的长度 —  S和S'的最长公共子串长度

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <map>
    
    using namespace std;
    
    const int maxn = 5000+10;
    
    int dp[2][maxn];
    char s1[maxn], s2[maxn];
    
    int main(){
        int n;
    
        while(scanf("%d", &n) == 1) {
            scanf("%s", s1);
    
            memset(dp[0], 0, sizeof(dp[0]));
            for(int i=0; i<n; i++) {
                s2[n-i-1] = s1[i];
            }
            s2[n] = '';
    
            for(int i=1; i<=n; i++) {
                for(int j=1; j<=n; j++) {
                    if(s1[i-1] == s2[j-1]) dp[i%2][j] = dp[(i-1)%2][j-1] + 1;
                    else dp[i%2][j] = max(dp[(i-1)%2][j], dp[i%2][j-1]);
                }
            }
    
            printf("%d
    ", n-dp[n%2][n]);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    $().click()和$(document).on("click","selector",function(){})的区别
    orm 常用字段及参数
    前端vue 跨组件传参,cokies,axion
    drf 异常 响应 解析 三大模块
    drf 视图家族
    表断关系,和modlesserializers序列化,反序列化
    drf ___jwt插件
    drf 排序过滤分页
    django drf cors 跨域问题
    redis 数据库
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3184916.html
Copyright © 2011-2022 走看看