区间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. vue -- 异常处理集合

    1.npm run dev 运行出错,报错如下: > webpack-dev-server --inline --progress --config build/webpack.dev.conf ...

  2. Ocelot(五)- 流量限制、服务质量

    Ocelot(五)- 流量限制.服务质量 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10965300.html 源码地址: ...

  3. 图解SSH上传安装eclipse

    安装eclipse 步骤: 1.SSH上传eclipse tar文件 2.linux下Computer-->FilesSystem-->soft显示上传的压缩包 3.解压eclipse文件 ...

  4. 2017-10-6 清北刷题冲刺班a.m

    1.角谷猜想 #include<iostream> #include<cstdio> #include<cstring> #define maxn 10010 us ...

  5. Repeater+AspNetPager+Ajax留言板

    最近想要巩固下基础知识,于是写了一个比较简单易懂实用的留言板. 部分样式参考了CSDN(貌似最近一直很火),部分源码参照了Alexis. 主要结构: 1.前期准备 2.Repeater+AspNetP ...

  6. 帝都Day6——图论

    //P2O5呢? 一.图的存储: 邻接矩阵:邻接表. 邻接矩阵:n*n的[][],[i][j]节点有边记1没边0 缺点 空间复杂度O(n^2) 占用内存较大(我为什么要把这些东西写到这里呢???) 邻 ...

  7. 高斯消元法的C++简单实现

    高斯消元法 首先,我们导入几个概念. 定义1: 一个矩阵称为阶梯形(行阶梯形),若它有以下三个性质: 1.每一非零行在每一零行之上: 2.某一行的先导元素所在的列位于前一行先导元素的后面: 3.某一行 ...

  8. BZOJ 2973 石头游戏 矩乘加速递推

    FFFFFFF,看了一上午才看懂,又调了一中午.....我终于明白为何自己如此菜了qwq 这个题加速的思路是:因为每个序列的长度小于6,他们的lcm是60,所以六十次以后就会回到原来的序列. 加速的就 ...

  9. Base64Utils

    package com.yundaex.common.crypto.base64; import java.io.ByteArrayInputStream; import java.io.ByteAr ...

  10. VMware安装CentOS7的详细过程

    原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool&utm_medium=referral 本篇文章主要介绍了VMware ...