// uva live 4394 String painter
//
// 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点
// 就敲阿敲阿敲,两个半小时后,发现例子过了。然而自己给出的数据跪了
// 交了也wa了,才发现,自己的方法是有问题的,假设是将两个串同一时候考虑
// 的话,比方: dp[i][j] 表示从i到j,s串刷成目标b串所须要的最小的花费
// 然后依据区间的端点的字符特点,进行状态转移,然而可能是我太搓了,
// 发现这种状态转移是不正确的。比方edc和cde,依照我d方法算出来是3,
// 这时。我想到了先处理出假设 d[i][i] = (s[i]==b[i]) ? 0 : 1,这样处理
// 出来确实是2,然而对于例子
// zzzzzfzzzzz
// abcdefedcba
// 显然。依照我的方法是5。默认f不用刷。 //
// 细致想来,假设状态是这样定义的话,那么状态转移就会非常麻烦,由于后面
// 的状态可能并非当前状态所能转移过去的,要加上额外的开销,至于这个
// 开销是什么。我依旧没弄明确,假设有大神能指点一二。那小子双手奉上
// 2.56$,并致以最为诚挚的感激。 //
// 最后看了看网上的题解,思路差点儿都是一样的。构造dp + 线性dp
// 首先不考虑s串与b串之间的联系。
// dp[i][j]表示从空串刷成b串所须要的最小的花费。
// dp[i][j] = dp[i][k] + dp[k+1][j]{ i <= k < j}
// 假设b[i] == b[j],那么dp[i][j] = dp[i][j-1],此时b[j]全然能够由i到j-1
// 刷出来。
//
// 最后f[i]表示1到i,s串变成b串所须要的最小花费
// 假设s[i] == b[i] 那么肯定 f[i] = f[i-1];
// 否则 f[i] = min(f[j] + dp[j+1][i]);
//
// 这样最后的f[n]我们所求的答案。
//
// 这题,我感觉我终于学会的是:假设一个问题是一个非常复杂的问题,要
// 考虑非常多个方面,那么我们能够尝试分段求解,这样也许就能更加接近
// 正确的答案。继续练
//
//const int maxn = 108;
//const int inf = 0x4f4f4f4f;
//char s[maxn];
//char b[maxn];
//int d[maxn][maxn];
//bool vis[maxn][maxn];
//int n;
//int cost[maxn][maxn];
//int dp(int x,int y){
// if (vis[x][y]) return d[x][y];
// vis[x][y] = 1;
// if (x==y){
// d[x][y] = 1;
// return d[x][y];
// }
// if (x>y) return d[x][y] = inf;
// int& ans = d[x][y];
// ans = inf;
//
//
//
// for (int k=x;k<y;k++){
// ans = min(ans,dp(x,k)+dp(k+1,y));
// }
//
// if (b[x]==b[y]){
// ans = min(ans,dp(x,y-1));
// }
//
//
//
//// if (s[x]==b[x] && s[y]==b[y]){
//// ans = min(ans,dp(x+1,y-1));
//// }
//// if (b[x]==b[y]){
//// ans = min(ans,dp(x,y-1));
//// ans = min(ans,dp(x+1,y));
//// }
////
//// temp = x;
//// while(b[temp]==b[y] && temp < y){
//// temp++;
//// }
//// ans = min(ans,dp(temp,y));
//// temp = y;
////
//// while(b[x]==b[temp] && temp > x){
//// temp--;
//// }
//// ans = min(ans,dp(x,temp));
////
//// temp = x;
////
//// while(b[temp]==b[temp+1]&&temp<y){
//// temp++;
//// }
////
//// if (temp!=x)
//// ans = min(ans,dp(temp,y));
////
//// temp = y;
//// while(b[temp]==b[temp-1]&&temp>x){
//// temp--;
//// }
//// if (temp!=y)
//// ans = min(ans,dp(x,temp));
//
//
// return ans;
//}
//
//void print(){
// for (int i=0;i<n;i++){
// for (int j=0;j<n;j++){
// if (d[i][j]==inf)
// d[i][j] = 0;
// printf("%d ",d[i][j]);
// }
// puts("");
// }
//}
//
//bool same(){
// for (int i=1;i<=n;i++)
// if (s[i]!=b[i])
// return false;
// return true;
//}
//
//void init(){
// memset(d,inf,sizeof(d));
// memset(vis,0,sizeof(vis));
// memset(cast,0,sizeof(cast));
// n = strlen(s+1);
// if (same()){
// printf("0\n");
// return ;
// }
//
// int cnt = 0;
// for (int i=1;i<=n;i++){
// if (s[i]==b[i]){
// cnt++;
// }
// cost[i] = cnt;
// }
//
// printf("%d\n",dp(1,n));
// print();
//}
//
//int main() {
// freopen("E:\\Code\\1.txt","r",stdin);
// while(scanf("%s%s",s+1,b+1)!=EOF){
// init();
// // solve();
// }
// return 0;
//} #include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#define ceil(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define gcd __gcd
#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
#define popCount __builtin_popcountll
typedef long long ll;
using namespace std;
const int MOD = 1000000007;
const long double PI = acos(-1.L); const int maxn = 108;
char s[maxn];
char b[maxn];
int d[maxn][maxn];
int f[maxn];
int n;
int vis[maxn][maxn];
const int inf = 0x1f1f1f1f; int dp(int x,int y){
if (vis[x][y]) return d[x][y]; vis[x][y] = 1; if (x==y) return d[x][y]=1;
if (x>y) return d[x][y] = inf;
int& ans = d[x][y];
ans = inf;
for (int k=x;k<y;k++){
ans = min(ans,dp(x,k) + dp(k+1,y));
}
if (b[x]==b[y]){
ans = min(ans,dp(x,y-1));
}
return ans;
} void print(){ for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
printf("%d ",d[i][j]);
}
cout << endl;
} for (int i=0;i<=n;i++)
printf("%d ",f[i]);
cout << endl;
} void init(){
n = strlen(s+1);
memset(d,inf,sizeof(d));
memset(vis,0,sizeof(vis));
dp(1,n);
memset(f,inf,sizeof(f));
f[0] = 0; for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
f[i] = min(f[i],f[j-1] + d[j][i]);
}
if (s[i]==b[i]){
f[i] = f[i-1];
}
} //print();
printf("%d\n",f[n]);
} int main() {
//freopen("E:\\Code\\1.txt","r",stdin);
while(scanf("%s%s",s+1,b+1)!=EOF){
init();
}
return 0;
}

uva live 4394 String painter 区间dp的更多相关文章

  1. uva live 4394 String painter 间隔dp

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

  2. hdu2476 String painter(区间dp)

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

  3. HDU2476 String painter —— 区间DP

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

  4. HDU2476 String painter——区间DP

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

  5. HDU 2476 String painter(区间dp)

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

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

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

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

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

  8. UVA Live Archive 4394 String painter(区间dp)

    区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...

  9. hdu_2476_String painter(区间DP)

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

随机推荐

  1. 利用python库twilio来免费发送短信

    大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...

  2. cobbler 无人值守-介绍

    cobbler 介绍 快速网络安装linux操作系统的服务,支持众多的Linux版本,也支持网络安装windows系统 PXE的二次封装,将多种安装参数封装到一个菜单 它是由Python编写的 还可以 ...

  3. ffmpeg mp4 mp3 wav flac webm aac ac3 ogg格式转换

    版权声明:本文为博主原创文章,未经允许不得转载. ffmpeg是Linux中转换音频视频文件的常用工具. mp4 to mp3: ffmpeg -i $ID.mp4 -acodec libmp3lam ...

  4. 昨天去面试,这5个Python面试题都被考到了,Python面试题No6

    第1题:字符串的拼接–如何高效的拼接两个字符串? 字符串拼接的几种方法 加号 逗号 直接连接 格式化 join 多行字符串拼接() 加号 print('Python' + 'Plus') 逗号 pri ...

  5. 杭电 5326 Work (并查集求子结点为k的结点数)

    Description It’s an interesting experience to move from ICPC to work, end my college life and start ...

  6. Tarjan 算法求割点、 割边、 强联通分量

    Tarjan算法是一个基于dfs的搜索算法, 可以在O(N+M)的复杂度内求出图的割点.割边和强联通分量等信息. https://www.cnblogs.com/shadowland/p/587225 ...

  7. 基本Sql语句汇总

    关于Sql语句的学习,选择的DBMS为SQL Server,Sql语句随着工作中的应用不断补充,不具备系统性,为个人笔记汇总,网上有很多优秀的资源,故不对每一处应用做过多细致的说明,后期会对部分篇幅较 ...

  8. Nginx与python web服务配置(Uwsgi& FastCGI)

    Uwsgi start uswgi uwsgi --harakiri 360000 --body-read-warning=10000 --max-fd=65536 -b 1000000 --http ...

  9. (转)]PYTHON Tkinter GUI

    import Tkinterroot=Tkinter.Tk()label=Tkinter.Label(root,text='hello ,python')label.pack()      #将LAB ...

  10. C# 中的新增功能

    百度搜索:C# 中的新增功能 微软有站点专门介绍:C# 中的新增功能. 地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/inde ...