zoukankan      html  css  js  c++  java
  • HDU 1513 && POJ 1159 Palindrome (DP+LCS+滚动数组)

    题意:给定一个字符串,让你把它变成回文串,求添加最少的字符数。

    析:动态规划是很明显的,就是没有了现思路,还是问的别人才知道,哦,原来要么写,既然是回文串,

    那么最后正反都得是一样的,所以我们就正反求LCS,这样公共的就求出来了,那么再用总数减掉这个LCS,

    那么剩下的肯定就是没有配对的了,就得必须加上了。

    思路有了,这里又出现一个问题,这个求LCS,要用的空间复杂度太大了,MLE了。。。有了思路,还是过不了,

    这个题应该用滚动数组来做,我想想在求LCS时,第一维我们只用到了i-1和i,所以呢,我们第二维只要开2行就够了,

    不断的来回存储,第一行和第二行反复,这样就OK了,至此这个题也就解决了。

    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    const int maxn = 5000 + 10;
    int d[2][maxn];
    char s[maxn], t[maxn];
    
    int main(){
        int n;
        while(~scanf("%d", &n)){
            scanf("%s", s+1);
            for(int i = 1; i <= n; ++i)
                t[i] = s[n-i+1];
            t[n+1] = '';
            memset(d, 0, sizeof(d));
    
            for(int i = 1; i <= n; ++i)
                for(int j = 1; j <= n; ++j){
                    int x = i % 2;
                    int y = 1 - x;
                    if(s[i] == t[j])  d[x][j] = d[y][j-1] + 1;
                    else  d[x][j] = max(d[y][j], d[x][j-1]);
                }
    
            printf("%d
    ", n - d[n%2][n]);
        }
        return 0;
    }
    
  • 相关阅读:
    LeetCode翻转矩阵后的得分-Python3<六>
    LeetCode子域名访问计数-Python3.7<五>
    LeetCode 键盘行-Python3.7<四>
    流程控制<二>
    Numbers、Strings、Lists 笔记<一>
    LeetCode-数组操作-Python<三>
    LeetCode链表相加-Python<二>
    LeetCode两数之和-Python<一>
    使用Django创建网站项目<二>
    Windows下vue-cli脚手架搭建入门<一>
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5540039.html
Copyright © 2011-2022 走看看