// 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; }

转载于:https://www.cnblogs.com/llguanli/p/6888323.html

uva live 4394 String painter 区间dp相关推荐

  1. uva live 4394 String painter 间隔dp

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

  2. LA 4394 String painter 区间DP -

    题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...

  3. HDU-2476 String painter 区间DP

    题意:给你一个长度相等的A串和B串,每次可以把一个连续的区间刷成一个字母,问从A串到B串的最少操作数. 解法:虽然这类题一看到就知道是区间DP,但是之前只做过类似从空串变成某个串的题目,所以没想到怎么 ...

  4. UVALive 4394 String painter——dp

    设ans[i]为区间[1,i]已经染好的最小花费 若s[i]=t[i],ans[i]=ans[i-1] 否则ans[i]=min{ans[j-1]+cost(j,i)},cost(j,i)为区间[j, ...

  5. UVALive 4394 String painter

    题目大意:有两个字符串A,B,一次刷可以把A串一段刷成同一个字母,问至少要刷几次才能把A串变成B串.串长≤100. 本来以为是个很简单的区间DP,后来发现直接区间DP是不行的,这玩意有后效性:刷完一整 ...

  6. NYOJ 1067 Compress String(区间dp)

    Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her ...

  7. [CF1107E]Vasya and Binary String【区间DP】

    题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...

  8. hdu_2476_String painter(区间DP)

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

  9. UVA 10003 Cutting Sticks (区间dp)

    题意: 给你一根木块,让你在n个点切块(不能改变顺序),使得总花费最小,看拿来切的那根木棍的长度. 代码: #include <map> #include <set> #inc ...

  10. Sticks UVA - 307(切木棍 线性区间dp,线性dp,区间思想。)

    题目大意:将n节木棒接成m个长度相等的木条,要求木条的长度尽可能的短 Time limit     3000 ms OS     Linux George took sticks of the sam ...

最新文章

  1. 【Android 逆向】函数拦截原理 ( 通过修改 GOT 全局偏移表拦截函数 | 通过在实际被调用的函数中添加跳转代码实现函数拦截 )
  2. O(n)级选排名第k位数(附上算法复杂度分析)
  3. RocketMQ简介
  4. 0402封装ESD二极管选型
  5. :网页设计与重构那些事儿
  6. 从工作实践中积累Linux常用脚本(一)
  7. 用 Python+openpose 实现抖音尬舞机
  8. BZOJ2176Strange string——最小表示法
  9. brew update失败提示:/System/Library/Frameworks/Ruby.framework/。。。解决方法
  10. 计算机图形学几何变换
  11. qml实现雪花飘落,快来给你的暑假降降温吧
  12. python 组合优化 回撤最小_【研究】如何用python实现Markowitz投资组合优化
  13. obj文件(1):obj文件用txt打开并且了解v,f,vn,vt的含义
  14. openwrt 配置过程
  15. 3D hand pose:BMC
  16. 每日一题----空瓶子喝可乐问题
  17. 视频教程-大型ERP实战项目教程-Java
  18. 什么是工厂模式、代理模式?
  19. web端对接海康平台V1.5.1插件
  20. 基于Java+Swing+Socket实现泡泡堂游戏

热门文章

  1. spring boot介绍及使用详解
  2. 几何画板构造象限平分线的步骤
  3. 外包如何安排人手-b
  4. 配置F5 负载均衡(转)
  5. U-boot在S3C2440上的移植详解(二)
  6. 490 - Rotating Sentences
  7. Linux中如何让进程在后台运行
  8. Java的继承 以学生管理系统为例
  9. Luogu3825[NOI2017] 游戏
  10. BZOJ1086[SCOI2005] 王室联邦