zoukankan      html  css  js  c++  java
  • hdu2476 区间dp

    题目大意就是给两个长度相同的字符串,每次操作能使一段变成相同的一个字符,要求是串1变成串2的最小操作数目

    (先假设从一个完全不相同的字符串变成串2)先用区间dp求出任意两点之间的最小操作数,dp[i][j]是i到j 的最小操作数

    然后用一个数组求串1到串2的最小操作数,对于某一点,如果s[i]==p[i],那么这个点不用操作,如果不相同,就从起点开始对a[i]更新一遍

    转移方程a[i]=min(a[i],a[j]+dp[j+1][i]);如果有某个点j小于i,从j开始刷到i加上a【j】最小,那么就是a【i】

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=100+10,maxn=60000+10,inf=0x3f3f3f;
    
    int dp[N][N],a[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        string s,p;
        while(cin>>s>>p)
        {
            int n=s.size();
            s="1"+s;
            p="1"+p;
            memset(dp,0,sizeof dp);
            for(int i=1;i<=n;i++)dp[i][i]=1;
            for(int i=n-1;i>=1;i--)
            {
                for(int j=i+1;j<=n;j++)
                {
                    dp[i][j]=dp[i+1][j]+1;
                    for(int k=i;k<j;k++)
                    {
                        if(p[i]==p[k+1])
                            dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
                    }
                }
            }
            for(int i=1;i<=n;i++)
            {
                a[i]=dp[1][i];
                if(s[i]==p[i])
                {
                    if(i==1)a[i]=0;
                    else a[i]=a[i-1];
                }
                else
                {
                    for(int j=1;j<i;j++)
                        a[i]=min(a[i],a[j]+dp[j+1][i]);
                }
            }
            cout<<a[n]<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    算法导论课后习题解析 第六章
    算法导论课后习题解析 第二章
    如果你也是.NET程序员
    查询对象模式
    为什么要面向对象呢
    HTTP强缓存和协商缓存 F
    MFC Dialog改变大小后,控件随之改变方法
    关于C++类型萃取
    docker配置docker
    idea 全局搜索(Ctrl+Shift+F)不能使用解决办法
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7521449.html
Copyright © 2011-2022 走看看