题目链接:https://vjudge.net/contest/164840#problem/A

题意:一个字符串刷子,每次可以将一段连续的字符串变成一种颜色,给两个字符串,最少通过几次可以将第一个字符串转换为第二个字符串;

分析:

首先假设第一个字符串和第二个字符串全部不相同,那么怎么刷成第二个字符串?

dp[i][j] 就是将完全不同的字符串刷成第二个的最少步数,可以这样考虑,当中间一个字符串和首字符串相同,

可能这样刷两次会比较好,当然这两个状态已经算出来了;

回到原题;

当两个字符串两个位置相同 ans[i] = ans[i-1] ,这个字符串可以不用刷;

不同,最坏情况就是 dp[1][i];同理,也可以找出两个部分来有可能更优;

 #include <bits/stdc++.h>

 using namespace std;

 const int maxn =  + ;
char str1[maxn];
char str2[maxn];
int dp[maxn][maxn];
int ans[maxn]; int main()
{
while(~scanf("%s%s",str1+,str2+)) { int len = strlen(str1+); memset(dp,,sizeof(dp)); for(int i=;i<=len;i++)
dp[i][i] = ; for(int i=;i<=len;i++) {
for(int j=;j+i-<=len;j++) {
int r = i+j-;
dp[j][r] = dp[j+][r] + ; //不能是 dp[j][r-1] + 1;这个还没算出来
for(int k=j+;k<=r;k++) {
if(str2[j]==str2[k])
dp[j][r] = min(dp[j][r],dp[j+][k]+dp[k+][r]);
}
}
} memset(ans,,sizeof(ans)); if(str1[] == str2[])
ans[] = ;
else ans[] = ;
for(int i=;i<=len;i++) {
if(str1[i]==str2[i])
ans[i] = ans[i-];
else {
ans[i] = dp[][i];
for(int j=;j<i;j++) { ans[i] = min(ans[i],ans[j]+dp[j+][i]);
}
}
}
printf("%d\n",ans[len]); }
return ;
}

Uva 4394 字符串刷子的更多相关文章

  1. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  2. UVa 12206 (字符串哈希) Stammering Aliens

    体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇. 也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低. #include <cstdio> #inclu ...

  3. hdu 2476 (string painter) ( 字符串刷子 区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. uva 11584 - 字符串 dp

    题目链接 一个长度1000的字符串最少划分为几个回文字符串 ---------------------------------------------------------------------- ...

  5. UVA 1584 字符串

    VJ 该题 链接  https://vjudge.net/problem/UVA-1584 AC代码   字典序最小输出 #include <stdio.h> #include <m ...

  6. UVa 10405 & POJ 1458 Longest Common Subsequence

    求最长公共子序列LCS,用动态规划求解. UVa的字符串可能含有空格,开始用scanf("%s", s);就WA了一次...那就用gets吧,怪不得要一行放一个字符串呢. (本来想 ...

  7. uva live 4394 String painter 间隔dp

    // uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...

  8. UVA 11584 Partitioning by Palindromes (字符串区间dp)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. UVA.455 Periodic Strings(字符串的最小周期)

    Periodic Strings 模板 题意分析 判断字符串的最小周期 代码总览 /* Title:UVA.455 Author:pengwill Date:2016-12-16 */ #includ ...

随机推荐

  1. .reverse ,join,split区分

    * 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组. * 2:arrayObject.join() * 注意:join() 方法用于把数组中的所 ...

  2. 从零开始学Linux(11)--more

    more命令,是将文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空格键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还 ...

  3. PIXI 太空玉兔游戏(6)

    想法来源  出于练习看到这篇文章   没有什么难度  效果如下,接下来会用pixijs讲解如何实现 创建应用及舞台 HTML部分只创建标签引入 pixi.min.js  即可: <script ...

  4. golang中的文件操作

    一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...

  5. # 防止xss攻击,过滤script标签,获取出标签外的内容

    from bs4 import BeautifulSoups = '<h1>123</h1> <span>456<span>'soup = Beauti ...

  6. VIRTIO概述和基本原理

    http://smilejay.com/2012/11/virtio-overview/ (KVM连载)5.1.1 VIRTIO概述和基本原理(KVM半虚拟化驱动) 11/15/2012MASTER  ...

  7. Hadoop Ecosystem related ports

    本文总结了Hadoop生态系统中各个组件使用的端口,包括了HDFS,Map Reduce,HBase,Hive,Spark,WebHCat,Impala,Alluxio,Sqoop等,后续会持续更新. ...

  8. unity摄像机移动滑动

    之前写了一个pc版本的 // 当按住鼠标左键的时候 //if (Input.GetMouseButton(0)) //{ // // 获取鼠标的x和y的值,乘以速度和Time.deltaTime是因为 ...

  9. Java集合一

    java的集合类主要由两个接口派生而出:Collection && Map 这两个接口是集合框架的根接口 Collection----直接派生:Set(无序集合,元素不可重复) Lis ...

  10. .NET开源工作流RoadFlow-表单设计-标签(label)

    LABEL标签即在表单中添加一个文本标签: 字号:标签显示文字的大小. 颜色:标签显示文字的颜色. 样式:以粗体和斜体显示.