zoukankan      html  css  js  c++  java
  • lightoj 1033【区间DP/LCS】

    题意:
    给你一个长度<=100的字符串。
    然后你可以在任何位置插入字符,问最少插入几个构成回文。

    思路:
    1.长度-LCS;
    2.区间DP;
    我保证小的区间是一个回文,然后枚举区间,构成大区间,就是很简单的区间dp
    dp[i,j]代表从i->j的最少数量。
    然后扩大,就好了吧。
    如果区间的两端是相同:dp[i,j]=dp[i+1,j-1]的大小。
    然后倒着枚举起点,然后区间大小慢慢扩大,然后总的区间越来越大。就是这样。

    code………..

    #include<bits/stdc++.h>
    #include<string.h>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ULL;
    const double eps=1e-5;
    const double pi=acos(-1.0);
    const int mod=1e8+7;
    const LL INF=0x3f3f3f3f;
    
    const int N=1e2+10;
    char s[N];
    
    int solve()
    {
        int dp[N][N];
        int len=strlen(s+1);
        memset(dp,0,sizeof(dp));
        for(int i=len-1;i>=1;i--)
            for(int j=i+1;j<=len;j++){
                if(s[i]==s[j])
                    dp[i][j]=dp[i+1][j-1];
                else
                    dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
            }
        return dp[1][len];
    }
    int solve_2()
    {
        int len=strlen(s+1);
        int dp[N][N];
        char s1[N];
        char s2[N];
        strcpy(s1+1,s+1);
        //strrev(s+1);          //字符串翻转给CE了。。。。
        //strcpy(s2+1,s+1);
        for(int i=1;i<=len;i++)
            s2[i]=s[len-i+1];
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=len;++i)
        {
            for(int j=1;j<=len;j++)
            {
                if(s1[i]==s2[j])
                    dp[i][j]=dp[i-1][j-1]+1;
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return len-dp[len][len];
    }
    
    int main()
    {
        int cas=1;
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int ans;
            scanf("%s",s+1);
            //ans=solve();
            ans=solve_2();
            printf("Case %d: %d
    ",cas++,ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    java总结1
    immutable
    iconfont
    实战build-react(三)+ style-components
    PHP判断字符串的包含
    win7 64位操作系统中 Oracle 11g 安装教程(图解)
    我在博客园写博客的原因
    面向对象程序设计-C++_课时17函数重载和默认参数
    面向对象程序设计-C++_课时16子类父类关系
    面向对象程序设计-C++_课时14对象组合_课时15继承
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934401.html
Copyright © 2011-2022 走看看