区间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. 气泡提示 纯CSS

    tooltip(气泡提示) 依赖 脚本文件:CalvinTip.js 样式文件:toolTip.css 参数 elems HTMLNode 必须 气泡提示的元素 options Object 可选 多 ...

  2. Java基础--常用API--集合类相关API

    一.泛型 1.泛型的本质是将类型参数化,即将数据类型作为参数. 2.泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性. 3.泛型可以用在类(泛型类).接口(泛型接口).方法 ...

  3. IDEA的git密码修改

    问题: 如果你办公的电脑是同事用过,在每次提交git的时候都显示是他的名字.想要修改提交git用户名密码. 但是博客idea 修改Git密码和账号方法所示方法无效.且操作系统是win10.(其他操作系 ...

  4. CF447A DZY Loves Hash 模拟

    DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert n numbers, in the ...

  5. poi使用

    1.首先需要下载Apache POI 打开poi下载的链接:http://poi.apache.org/download.html  ,点击“The latest stable release is ...

  6. ACM-较大的数乘法取模技巧*

    比如模数是1e15这种,相乘的时候爆LL了,但是又不想用大数,咋办呢? long long ksc(long long a, long long b, long long mod){ ; while( ...

  7. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall (暴力)

    题意:一个n*m的方格矩阵,有的格子被涂成了黑色,问该矩阵中有多少个子矩阵,子矩阵不包含黑色格子; 思路:对于一个长为L, 高为H的无黑点矩阵中包含的高为H的子矩阵个数为L+(L-1)+(L-2)+. ...

  8. CF D. Recovering BST (区间DP)

    题意:给你n个节点,每个节点有一个权值,两个点可以连边当且仅当这两个点的gcd>1,问你这n个点能否构成一个二叉搜索树(每个节点最多有两个儿子,且左儿子小于右儿子),输入为递增顺序. 分析: 若 ...

  9. APP请求超时问题-ios超时-android超时

    最近发现公司的app在高峰期超时严重.用wifi网络一直超时,但qq等却正常.换成手机卡网络正常. 起初以为是DNS解析问题. 后来抓包,发现DNS解析正常,可以得到正确的A记录. 但tcp retr ...

  10. 使用shell巧妙高效的批量删除历史文件或目录

    背景:有实时产生的数据按小时分文件保存,如“/data/2013/09/18/14.txt”.现需要保留30天的最新数据,而删除所有其它的历史数据.注意“保留30天的最新数据”,可能不是连续的30天, ...