HDU 2476 String painter 刷字符串(区间DP)
题意:
给出两个串s1和s2,每次可以将s1中的一个整个区间刷成同个字母,问最少刷几次才能让s1变成s2?
思路:
假设最坏情况,两串没任何一个位置是相同的,那么全都得刷,相当于将一个空白串刷成s2。
这一步得求出所有子区间的最低次数。由于两串可能存在某些相同的字母,可以不刷,这样有可能会出现更优的解了。
#include <iostream>
#include <cstring>
#include <algorithm>
#define N 110
using namespace std;
char a[N], b[N];
int len, dp[N][N], ans[N]; //ans[i]表示将a[0~i]刷成b[0~i]的最小次数 void paint_b() //空白串刷成串b
{
for(int i=; i<len; i++)
{
for(int j=i; j>=; j--)
{
dp[j][i]=dp[j+][i]+;
for(int k=j+; k<=i; k++)
{
if(b[j]!=b[k]) continue;
dp[j][i]=min(dp[j][i], dp[j+][k] + dp[k+][i]);
}
}
}
}
void paint_a()
{
memcpy(ans, dp, sizeof(int)*len); //拷贝dp[0][0~len-1].
if(a[]==b[]) ans[]=; //处理第一个
else ans[]=;
for(int i=; i<len; i++) //考虑前[0~i]
{
if(a[i]==b[i])
{
ans[i]=ans[i-]; //a[i]不需要刷
continue;
}
for(int j=; j<i; j++ ) //枚举相同的位置
{
if(a[j]!=b[j]) continue;
ans[i]= min(ans[i], ans[j-]+dp[j+][i] ); //两种决策:a[j]刷or不刷
}
}
}
int main()
{
while(cin>>a>>b)
{
memset(dp, , sizeof(dp));
len=strlen(a);
paint_b(); //求空白串刷出串b的最小次数
paint_a(); //将串a刷成串b的最小刷法次数
printf("%d\n", ans[len-]);
}
return ;
}
AC代码
HDU 2476 String painter 刷字符串(区间DP)的更多相关文章
- hdu 2476 (string painter) ( 字符串刷子 区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- HDU 2476 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 2476 String painter(区间dp)
题意: 给定两个字符串,让求最少的变化次数从第一个串变到第二个串 思路: 区间dp, 直接考虑两个串的话太困难,就只考虑第二个串,求从空白串变到第二个串的最小次数,dp[i][j] 表示i->j ...
- HDU 2476 String painter(记忆化搜索, DP)
题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...
- hdu 2476 String Painter
第一道区间dp题,感觉题意不是很好理解 题意:一次可以转换某一个位置的字符,或是一串连续的字符,举第一个例子zzzzzfzzzzz 1:aaaaaaaaaaa 2: abbbbbbbbba 3: ab ...
- HDU 2476 String painter(区间DP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...
- hdu 2476"String painter"(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...
- HDU 4283---You Are the One(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...
随机推荐
- cookie 单值设置
- Gson应用:利用map和list来拼装Json消息
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; i ...
- ProtoBuf练习(一)
基础数据类型 protobuf语言的基础字段类型相当于C++语言的基础类型 工程目录结构 $ ls proto/ TFixed.proto TInt.proto TScalar.proto TStr. ...
- 【转】C#里partial关键字的作用
源地址:http://www.cnblogs.com/OpenCoder/archive/2009/10/27/1590328.html
- RequireJS 2.0 API之配置项
转载自http://blog.csdn.net/kevinwon1985/article/details/8155267 RequireJS 把每一个依赖项当做一个script标签,使用 head.a ...
- [sql] view plain copy
[sql] view plain copy CREATE TABLE SYS_USER ( USER_CODE VARCHAR( 36 ) NOT NULL, LOGIN_NAME VARCHAR( ...
- VS2017(Visual Studio2017) 搭建QT5开发环境
VS创建QT工程并添加到GitHub中 大家好! 欢迎打开并阅读本文,这次咱们说说怎么在VS中创建一个QT项目并且放到GitHub中吧 因为GitHub或者码云Gitee都是一个很好的提供代码托管的地 ...
- 小程序组件的继承 - behavior
1.目录结构 demo-one 和 demo-two 一起公用一些属性 和 方法 存在demo-beh.js中 需要像模块一样导出 2.调用的方法: // components/demo-class/ ...
- git 脚本
echo $PWD message=$1 content='.' if [ ! -n "$1" ] ;then message=`date` message=$message' 推 ...
- chapter09
import java.io.File import java.nio.file._ import scala.collection.mutable.ArrayBuffer/** * Created ...