zoukankan      html  css  js  c++  java
  • Palindrome--poj 1159(最长公共子字符串+滚动数字)

    http://poj.org/problem?id=1159

    题目大意:  给你一个n  代表n个字符   第二行给你一个字符串  求使这个字符串变成回文字符串 最少需要添加多少个字符

    分析:   原来的字符串长度-原来的字符串与逆置后的字符串的最长公共字串  就是求得的添加的字符

    但是n是5000  如果单用dp[N][N]  肯定会内存超限   所以我们用滚动数字   

    这是我第一次接触滚动数字  好像也是dp的一种   就是把第一维变成2 反正每一次i j 都只用到上一层   

    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<vector>
    #include<queue>
    #include<cmath>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    #define N 5100
    #define INF 0xfffffff
    #define memset(a,b) memset(a,b,sizeof(a))
    
    int dp[2][N];
    char str[N],ch[N];
    int main()
    {
        int n;
    
        while(scanf("%d",&n)!=EOF)
        {
            memset(dp,0);
            memset(str,0);
            memset(ch,0);
            scanf("%s",str);
            int l=strlen(str);
            for(int i=0;str[i];i++)
                ch[i]=str[l-i-1];
    
            for(int i=0;str[i];i++)
            {
                for(int j=0;ch[j];j++)
                {
                    if(str[i]==ch[j])
                    dp[(i+1)%2][j+1]=dp[i%2][j]+1;
                    else
                    {
                        dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]);
                    }
                }
            }
            printf("%d
    ",l-dp[l%2][l]);
        }
        return 0;
    }
  • 相关阅读:
    HTTP BIN测试
    JavaMail
    Linux内存分析
    HDU 4118 树形DP Holiday's Accommodation
    线性方程组的求解(C++)
    线性方程组的求解(C++)
    区间树(segment tree)
    区间树(segment tree)
    同余定理在算法求解中的应用
    同余定理在算法求解中的应用
  • 原文地址:https://www.cnblogs.com/linliu/p/5382331.html
Copyright © 2011-2022 走看看