zoukankan      html  css  js  c++  java
  • 字符串涂漆

    题目描述:

    两个由小写字母组成的字符串A和B,长度相等,你的任务就是将字符串A涂成字符串B。你可以将连续的一片涂成某个小写字母,目标是使用最少的次数将A涂成B。

    输入:

    输入两行字符串,第一行为字符串A,第二行为字符串B。

    输出:

    输出最少涂几次。

    样例输入:

    zzzzzfzzzzz
    abcdefedcba

    样例输出:

    6

    emmm……

    这一看有最大最小值问题就是DP了,不过这是一道区间DP。
    我们可以先尝试将无涂成第二串,然后再决策,是否有些地方可以减少涂的次数。用g[i]表示将第一个字符串[1,i]位置涂成第二串需要的最少操作,如果第i个字符一样,这个点可以不涂,即:if(s[i]==t[i]) g[i]=g[i-1];否则枚举中点:g[j]+dp[j+1][i]。

    #include<cstring>
    #include<cstdio>
    #include<iostream> using namespace std; char s[205],t[205]; int n,dp[205][205],g[205]; int dfs(int st,int ed) { if(st==ed) return dp[st][ed]=1; if(dp[st][ed]!=-1) return dp[st][ed]; dp[st][ed]=1000000; for(int i=st;i<ed;i++) { dp[st][ed]=min(dp[st][ed],dfs(st,i)+dfs(i+1,ed)-(t[st]==t[ed])); } return dp[st][ed]; } int main() { scanf("%s%s",s+1,t+1); n=strlen(s+1); memset(dp,-1,sizeof(dp)); dfs(1,n); for(int i=1;i<=n;i++) { if(s[i]==t[i]) g[i]=g[i-1]; else { g[i]=dp[1][i]; for(int j=1;j<i;j++) { g[i]=min(g[i],g[j]+dp[j+1][i]); } } } printf("%d ",g[n]); return 0;
    }
  • 相关阅读:
    17.天堂和地狱只在你的一念之间
    14.事情原来可能更糟
    如何评价一个网站的人气(Link Popularity Check)
    1.人生何必一定要成功
    4.何不看开一点
    字符串到枚举的转换代码
    广州泳场一览表
    收集开源项目
    7.把“失去”当作“抛弃”
    经常使用的Oracle监控语句
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8067106.html
Copyright © 2011-2022 走看看