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

    题目传送门

    题意:一个字符串要变成回文串至少要插入多少个字符

    分析:LCS,长度 - 原串和反串的最大相同长度就是要插入的个数。解释一下,当和反串相同时,在原串中已经是回文的部分了,那么减去LCS长度后剩下的多少个插入多少个一定就能使原串回文dp数组二维都开5000的话就会超内存,这里就用到了滚动数组,因为在LCS的计算中,i的变化只相差1,所以可以通过对2取余来进行滚动:)

    收获:原串和反串取LCS能得到部分回文串,推荐继续看:UVA 11404 Palindromic Subsequence

    代码:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    const int MAXN = 5e3 + 10;
    const int INF = 0x3f3f3f3f;
    int dp[2][MAXN];
    string s, ss;
    
    int LCS(int n)  {
        int x = 0;
        for (int i=1; i<=n; ++i)  {
            x = 1 - x;
            for (int j=1; j<=n; ++j)  {
                if (ss[i-1] == s[j-1])  {
                    dp[x][j] = dp[1-x][j-1] + 1;
                }
                else  {
                    dp[x][j] = max (dp[x][j-1], dp[1-x][j]);
                }
            }
        }
    
        return dp[x][n];
    }
    
    int main(void)  {
        int n;
        while (~scanf ("%d", &n))  {
            memset (dp, 0, sizeof (dp));
            cin >> ss;
            s = ss;
            reverse (s.begin (), s.end ());
    
            int res = LCS (n);
            printf ("%d
    ", n - res);
        }
    
        return 0;
    }
    编译人生,运行世界!
  • 相关阅读:
    [12.19模拟赛]矩形|扫描线+set
    网 络
    数组(二维)
    数组
    02-线程的三种创建方式
    01-线程(概念篇)
    IO流-文件操作
    Serializable 可串行化接口
    PrintStream 类
    ObjectIntputStream / ObjectOutputStream 类
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4466923.html
Copyright © 2011-2022 走看看