Uva 4394 字符串刷子
题目链接: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 字符串刷子的更多相关文章
- 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 ...
- UVa 12206 (字符串哈希) Stammering Aliens
体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇. 也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低. #include <cstdio> #inclu ...
- hdu 2476 (string painter) ( 字符串刷子 区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- uva 11584 - 字符串 dp
题目链接 一个长度1000的字符串最少划分为几个回文字符串 ---------------------------------------------------------------------- ...
- UVA 1584 字符串
VJ 该题 链接 https://vjudge.net/problem/UVA-1584 AC代码 字典序最小输出 #include <stdio.h> #include <m ...
- UVa 10405 & POJ 1458 Longest Common Subsequence
求最长公共子序列LCS,用动态规划求解. UVa的字符串可能含有空格,开始用scanf("%s", s);就WA了一次...那就用gets吧,怪不得要一行放一个字符串呢. (本来想 ...
- uva live 4394 String painter 间隔dp
// uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...
- UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA.455 Periodic Strings(字符串的最小周期)
Periodic Strings 模板 题意分析 判断字符串的最小周期 代码总览 /* Title:UVA.455 Author:pengwill Date:2016-12-16 */ #includ ...
随机推荐
- .reverse ,join,split区分
* 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组. * 2:arrayObject.join() * 注意:join() 方法用于把数组中的所 ...
- 从零开始学Linux(11)--more
more命令,是将文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空格键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还 ...
- PIXI 太空玉兔游戏(6)
想法来源 出于练习看到这篇文章 没有什么难度 效果如下,接下来会用pixijs讲解如何实现 创建应用及舞台 HTML部分只创建标签引入 pixi.min.js 即可: <script ...
- golang中的文件操作
一.文件的基本介绍 文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件.文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等. ...
- # 防止xss攻击,过滤script标签,获取出标签外的内容
from bs4 import BeautifulSoups = '<h1>123</h1> <span>456<span>'soup = Beauti ...
- VIRTIO概述和基本原理
http://smilejay.com/2012/11/virtio-overview/ (KVM连载)5.1.1 VIRTIO概述和基本原理(KVM半虚拟化驱动) 11/15/2012MASTER ...
- Hadoop Ecosystem related ports
本文总结了Hadoop生态系统中各个组件使用的端口,包括了HDFS,Map Reduce,HBase,Hive,Spark,WebHCat,Impala,Alluxio,Sqoop等,后续会持续更新. ...
- unity摄像机移动滑动
之前写了一个pc版本的 // 当按住鼠标左键的时候 //if (Input.GetMouseButton(0)) //{ // // 获取鼠标的x和y的值,乘以速度和Time.deltaTime是因为 ...
- Java集合一
java的集合类主要由两个接口派生而出:Collection && Map 这两个接口是集合框架的根接口 Collection----直接派生:Set(无序集合,元素不可重复) Lis ...
- .NET开源工作流RoadFlow-表单设计-标签(label)
LABEL标签即在表单中添加一个文本标签: 字号:标签显示文字的大小. 颜色:标签显示文字的颜色. 样式:以粗体和斜体显示.