区间dp,两个str一起考虑很难转移。

看了别人题解以后才知道是做两次dp。

dp1。str1最坏情况下和str2完全不相同,相当于从空白串开始刷。

对于一个区间,有两种刷法,一起刷,或者分开来刷。

规定[i][i-1]为空串,这样一起刷可以归结为第二种情况。

合并的时候,大的区间的次数<=小的区间的,和新加入区间的字符有关。

小的区间是一个字符一个字符的变成大区间的。

所以每次考虑新加入区间的尾部字符j,枚举k划分区间[i][k-1],[k][j]。

要使得刷的次数减少,只有尽量一起刷。比如aba,aa,abcda。

当s[k] == s[j]的时候可以先刷一遍[i,j]然后刷中间,等效于dp[k][j-1]。

dp2。得出最坏的情况以后。dp2[i]表示以i结尾的子串的最优解。

然后考虑结尾s[i]和t[i]的关系。

#include<bits/stdc++.h>
using namespace std; const int LEN = ;
char s[LEN], t[LEN]; int dp[LEN][LEN];
int dp2[LEN]; //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
while(gets(s)){
gets(t);
int len = strlen(t); for(int d = ; d < len; d++){
for(int i = ; i <= len; i++){
int j = i+d; //每次只考虑新加入区间的j
dp[i][j] = dp[i][j-] + ; //单刷
for(int k = i; k < j; k++){//划分区间,[i,k-1] [k,j]分开来刷 [i][i-1]表示为空
if(t[k-] == t[j-]){ // dp[i][j-1] <= dp[i][k-1]+dp[k][j-1],所以只有t[k-1] == t[j-1]才可能有更优的解
dp[i][j] = min(dp[i][j],dp[i][k-]+dp[k][j-]);
}
}
}
}
for(int i = ; i <= len; i++){
if(s[i-] == t[i-]) dp2[i] = dp2[i-]; //新的这个可以不刷
else { //不等则划分
dp2[i] = i;
for(int k = ; k < i; k++){
dp2[i] = min(dp2[i],dp2[k]+dp[k+][i]);
}
}
}
printf("%d\n",dp2[len]);
}
return ;
}

UVA Live Archive 4394 String painter(区间dp)的更多相关文章

  1. uva live 4394 String painter 区间dp

    // uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...

  2. uva live 4394 String painter 间隔dp

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

  3. hdu2476 String painter(区间dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2476 Problem Description There are two strings ...

  4. HDU2476 String painter —— 区间DP

    题目链接:https://vjudge.net/problem/HDU-2476 String painter Time Limit: 5000/2000 MS (Java/Others)    Me ...

  5. HDU2476 String painter——区间DP

    题意:要把a串变成b串,每操作一次,可以使a串的[l,r]区间变为相同的一个字符.问把a变成b最少操作几次. 这题写法明显是区间dp ,关键是处理的方法. dp[l][r]表示b串的l~r区段至少需要 ...

  6. HDU 2476 String painter(区间dp)

    题意: 给定两个字符串,让求最少的变化次数从第一个串变到第二个串 思路: 区间dp, 直接考虑两个串的话太困难,就只考虑第二个串,求从空白串变到第二个串的最小次数,dp[i][j] 表示i->j ...

  7. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  8. hdu 2476"String painter"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...

  9. hdu_2476_String painter(区间DP)

    题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...

随机推荐

  1. BZOJ 1858【线段树】

    题意:  0 a b 把 [a, b] 区间内的所有数全变成0  1 a b 把 [a, b] 区间内的所有数全变成1  2 a b 把 [a,b] 区间内的所有数全部取反  3 a b 询问 [a, ...

  2. 51nod1049(最大子段和2)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1049 题意:中文题诶- 思路:本题和51nod1049(题解 ...

  3. 洛谷P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  4. 记一次工作中的小BUG

    今天在调试代码的时候总是遇到一个bug,百思不得其解!先上bug图 我用的webapi 集成的swagger,错误提示是路由名称冲突,可我仔细检查了下并没有冲突的路由地址啊!于是上网查找资料,有位网友 ...

  5. EOS 用户权限相关命令

    首先,环境相关的配置请参考https://www.cnblogs.com/hbright/p/9266420.html 在这里,我们一起看年EOS权限相关的东东.我们先查看hml这个用户的相关信息 h ...

  6. k8s缩放应用程序

    参考:https://kubernetes.io/docs/tutorials/kubernetes-basics/ 步骤1:扩展部署 要列出部署,请使用GET部署命令:kubectl get dep ...

  7. 浅谈关于SRAM与DRAM的区别

    在上体系结构这门课之前,我只知道DRAM用作内存比较多,SRAM用作cache比较多.在今天讲到内存技术时,我对于这两个基础概念有了更加完整的认识.这篇文章是我的听课心得,现在分享给各位,仅供参考,若 ...

  8. Spring ThreadPoolTaskExecutor队列满的异常处理

    <!-- 配置线程池 --> <bean id="threadPool" class="org.springframework.scheduling.c ...

  9. props简单小栗子

    props简单小栗子 可以直接copy查看结果 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  10. P2308 添加括号(区间DP)

    题目背景 给定一个正整数序列a(1),a(2),...,a(n),(1<=n<=20) 不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和. 例如: 给 ...