zoukankan      html  css  js  c++  java
  • POJ 1159 Palindrome

    原题请戳这里
    题意:给你个串,求最少添加多少个字符使它成为回文串。
    思路:没有思路

    网上题解的思路 DP

    将正序列和反序列做一次LCS就行
    dp[i][j]表示正向到 i , 反向到 j 的LCS长度
    dp[i][j]=max( dp[i-1][j-1]+1 //正向i==反向j
    dp[i-1][j], dp[i][j-1] //正向i!=反向j )
    最后要求的是len-dp[len][len]
    转自:http://blog.csdn.net/allenlsy/article/details/4967105

    用short不用滚动数组 还是可以过的,,(5000*5000/1024*2<50000,题中的memory是65536K)

    //By: Sirius_Ren
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    short f[5005][5005];
    int n;
    char a[5555],b[5555];
    int main()
    {
        scanf("%d",&n);
        scanf("%s",a+1);
        for(int i=0;i<n;i++)b[i+1]=a[n-i];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(a[i]==b[j])
                    f[i][j]=f[i-1][j-1]+1;
                else
                    f[i][j]=max(f[i-1][j],f[i][j-1]);
        printf("%d",n-f[n][n]);
    }

    这里写图片描述

    这是用滚动数组的;;;

    //By: Sirius_Ren
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    short f[2][5005];
    int n;
    char a[5005],b[5005];
    int main(){
        scanf("%d",&n);
        scanf("%s",a+1);
        for(int i=0;i<n;i++) b[i+1]=a[n-i];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(a[i]==b[j])f[i%2][j]=f[(i-1)%2][j-1]+1;
                else f[i%2][j]=max(f[(i-1)%2][j],f[i%2][j-1]);
        printf("%d",n-f[n%2][n]);
    }

    这里写图片描述

  • 相关阅读:
    ubuntu配置bonding 武汉
    桌面图标加载与存储
    launcher 图标删除分析
    Inflater
    Android屏幕元素层次结构
    简述Android触摸屏手势识别
    RelativeLayout && inflate
    manifest分析
    vacantcell缓存分析
    桌面快捷键和桌面livefolder
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532467.html
Copyright © 2011-2022 走看看