1. // uva live 4394 String painter
  2. //
  3. // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点
  4. // 就敲阿敲阿敲,两个半小时后,发现例子过了。然而自己给出的数据跪了
  5. // 交了也wa了,才发现,自己的方法是有问题的,假设是将两个串同一时候考虑
  6. // 的话,比方: dp[i][j] 表示从i到j,s串刷成目标b串所须要的最小的花费
  7. // 然后依据区间的端点的字符特点,进行状态转移,然而可能是我太搓了,
  8. // 发现这种状态转移是不正确的。比方edc和cde,依照我d方法算出来是3,
  9. // 这时。我想到了先处理出假设 d[i][i] = (s[i]==b[i]) ? 0 : 1,这样处理
  10. // 出来确实是2,然而对于例子
  11. // zzzzzfzzzzz
  12. // abcdefedcba
  13. // 显然。依照我的方法是5。默认f不用刷。
  14.  
  15. //
  16. // 细致想来,假设状态是这样定义的话,那么状态转移就会非常麻烦,由于后面
  17. // 的状态可能并非当前状态所能转移过去的,要加上额外的开销,至于这个
  18. // 开销是什么。我依旧没弄明确,假设有大神能指点一二。那小子双手奉上
  19. // 2.56$,并致以最为诚挚的感激。
  20.  
  21. //
  22. // 最后看了看网上的题解,思路差点儿都是一样的。构造dp + 线性dp
  23. // 首先不考虑s串与b串之间的联系。
  24. // dp[i][j]表示从空串刷成b串所须要的最小的花费。
  25. // dp[i][j] = dp[i][k] + dp[k+1][j]{ i <= k < j}
  26. // 假设b[i] == b[j],那么dp[i][j] = dp[i][j-1],此时b[j]全然能够由i到j-1
  27. // 刷出来。
  28. //
  29. // 最后f[i]表示1到i,s串变成b串所须要的最小花费
  30. // 假设s[i] == b[i] 那么肯定 f[i] = f[i-1];
  31. // 否则 f[i] = min(f[j] + dp[j+1][i]);
  32. //
  33. // 这样最后的f[n]我们所求的答案。
  34. //
  35. // 这题,我感觉我终于学会的是:假设一个问题是一个非常复杂的问题,要
  36. // 考虑非常多个方面,那么我们能够尝试分段求解,这样也许就能更加接近
  37. // 正确的答案。继续练
  38. //
  39. //const int maxn = 108;
  40. //const int inf = 0x4f4f4f4f;
  41. //char s[maxn];
  42. //char b[maxn];
  43. //int d[maxn][maxn];
  44. //bool vis[maxn][maxn];
  45. //int n;
  46. //int cost[maxn][maxn];
  47. //int dp(int x,int y){
  48. // if (vis[x][y]) return d[x][y];
  49. // vis[x][y] = 1;
  50. // if (x==y){
  51. // d[x][y] = 1;
  52. // return d[x][y];
  53. // }
  54. // if (x>y) return d[x][y] = inf;
  55. // int& ans = d[x][y];
  56. // ans = inf;
  57. //
  58. //
  59. //
  60. // for (int k=x;k<y;k++){
  61. // ans = min(ans,dp(x,k)+dp(k+1,y));
  62. // }
  63. //
  64. // if (b[x]==b[y]){
  65. // ans = min(ans,dp(x,y-1));
  66. // }
  67. //
  68. //
  69. //
  70. //// if (s[x]==b[x] && s[y]==b[y]){
  71. //// ans = min(ans,dp(x+1,y-1));
  72. //// }
  73. //// if (b[x]==b[y]){
  74. //// ans = min(ans,dp(x,y-1));
  75. //// ans = min(ans,dp(x+1,y));
  76. //// }
  77. ////
  78. //// temp = x;
  79. //// while(b[temp]==b[y] && temp < y){
  80. //// temp++;
  81. //// }
  82. //// ans = min(ans,dp(temp,y));
  83. //// temp = y;
  84. ////
  85. //// while(b[x]==b[temp] && temp > x){
  86. //// temp--;
  87. //// }
  88. //// ans = min(ans,dp(x,temp));
  89. ////
  90. //// temp = x;
  91. ////
  92. //// while(b[temp]==b[temp+1]&&temp<y){
  93. //// temp++;
  94. //// }
  95. ////
  96. //// if (temp!=x)
  97. //// ans = min(ans,dp(temp,y));
  98. ////
  99. //// temp = y;
  100. //// while(b[temp]==b[temp-1]&&temp>x){
  101. //// temp--;
  102. //// }
  103. //// if (temp!=y)
  104. //// ans = min(ans,dp(x,temp));
  105. //
  106. //
  107. // return ans;
  108. //}
  109. //
  110. //void print(){
  111. // for (int i=0;i<n;i++){
  112. // for (int j=0;j<n;j++){
  113. // if (d[i][j]==inf)
  114. // d[i][j] = 0;
  115. // printf("%d ",d[i][j]);
  116. // }
  117. // puts("");
  118. // }
  119. //}
  120. //
  121. //bool same(){
  122. // for (int i=1;i<=n;i++)
  123. // if (s[i]!=b[i])
  124. // return false;
  125. // return true;
  126. //}
  127. //
  128. //void init(){
  129. // memset(d,inf,sizeof(d));
  130. // memset(vis,0,sizeof(vis));
  131. // memset(cast,0,sizeof(cast));
  132. // n = strlen(s+1);
  133. // if (same()){
  134. // printf("0\n");
  135. // return ;
  136. // }
  137. //
  138. // int cnt = 0;
  139. // for (int i=1;i<=n;i++){
  140. // if (s[i]==b[i]){
  141. // cnt++;
  142. // }
  143. // cost[i] = cnt;
  144. // }
  145. //
  146. // printf("%d\n",dp(1,n));
  147. // print();
  148. //}
  149. //
  150. //int main() {
  151. // freopen("E:\\Code\\1.txt","r",stdin);
  152. // while(scanf("%s%s",s+1,b+1)!=EOF){
  153. // init();
  154. // // solve();
  155. // }
  156. // return 0;
  157. //}
  158.  
  159. #include <algorithm>
  160. #include <bitset>
  161. #include <cassert>
  162. #include <cctype>
  163. #include <cfloat>
  164. #include <climits>
  165. #include <cmath>
  166. #include <complex>
  167. #include <cstdio>
  168. #include <cstdlib>
  169. #include <cstring>
  170. #include <ctime>
  171. #include <deque>
  172. #include <functional>
  173. #include <iostream>
  174. #include <list>
  175. #include <map>
  176. #include <numeric>
  177. #include <queue>
  178. #include <set>
  179. #include <stack>
  180. #include <vector>
  181. #define ceil(a,b) (((a)+(b)-1)/(b))
  182. #define endl '\n'
  183. #define gcd __gcd
  184. #define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
  185. #define popCount __builtin_popcountll
  186. typedef long long ll;
  187. using namespace std;
  188. const int MOD = 1000000007;
  189. const long double PI = acos(-1.L);
  190.  
  191. const int maxn = 108;
  192. char s[maxn];
  193. char b[maxn];
  194. int d[maxn][maxn];
  195. int f[maxn];
  196. int n;
  197. int vis[maxn][maxn];
  198. const int inf = 0x1f1f1f1f;
  199.  
  200. int dp(int x,int y){
  201. if (vis[x][y]) return d[x][y];
  202.  
  203. vis[x][y] = 1;
  204.  
  205. if (x==y) return d[x][y]=1;
  206. if (x>y) return d[x][y] = inf;
  207. int& ans = d[x][y];
  208. ans = inf;
  209. for (int k=x;k<y;k++){
  210. ans = min(ans,dp(x,k) + dp(k+1,y));
  211. }
  212. if (b[x]==b[y]){
  213. ans = min(ans,dp(x,y-1));
  214. }
  215. return ans;
  216. }
  217.  
  218. void print(){
  219.  
  220. for (int i=1;i<=n;i++){
  221. for (int j=1;j<=n;j++){
  222. printf("%d ",d[i][j]);
  223. }
  224. cout << endl;
  225. }
  226.  
  227. for (int i=0;i<=n;i++)
  228. printf("%d ",f[i]);
  229. cout << endl;
  230. }
  231.  
  232. void init(){
  233. n = strlen(s+1);
  234. memset(d,inf,sizeof(d));
  235. memset(vis,0,sizeof(vis));
  236. dp(1,n);
  237. memset(f,inf,sizeof(f));
  238. f[0] = 0;
  239.  
  240. for (int i=1;i<=n;i++){
  241. for (int j=1;j<=i;j++){
  242. f[i] = min(f[i],f[j-1] + d[j][i]);
  243. }
  244. if (s[i]==b[i]){
  245. f[i] = f[i-1];
  246. }
  247. }
  248.  
  249. //print();
  250. printf("%d\n",f[n]);
  251. }
  252.  
  253. int main() {
  254. //freopen("E:\\Code\\1.txt","r",stdin);
  255. while(scanf("%s%s",s+1,b+1)!=EOF){
  256. init();
  257. }
  258. return 0;
  259. }

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. JS实现两版本号大小比较

    JavaScript实现版本号比对(含字母) 昨天,有一道面试题,要求是这样的: 用你熟悉的编程语言,实现一个比较任意两个软件版本号大小的函数,如1.2.3a与1.2.4b进行比较,后者版本号更大,要 ...

  2. 【简●解】[ZJOI2005]午餐

    [简●解][ZJOI2005]午餐 [关键词] \(DP\) 排序/贪心 [分析] 首先,一个很明显的贪心思路,就是吃的慢的人先打饭.所以把数据按吃饭时间从大到小排一遍序. 根据\(dp\)的尿性,比 ...

  3. 【Python基础】迭代器、生成器

    迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...

  4. laravel(4.2) +Zizaco

    操作步骤:https://github.com/Zizaco/entrust/tree/1.0 这篇博客说的蛮详细的:http://blog.boolw.com/?p=241 简化后的步骤 1.在根项 ...

  5. Python编译错误总结

    1.TypeError: object() takes no parameters 如果你出现了这个报错,请检查你的__init__函数名或者其定义有没有写错.一般是把__init__写成了__int ...

  6. HDU 5468 Puzzled Elena

    Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...

  7. [BZOJ4207]Can

    [BZOJ4207]Can 试题描述 这个问题是源于一个在棋盘上玩的,由Sid Sackson设计的名叫Can't stop的游戏的.这个问题与Can't stop有一定的相似之处,但是不需要玩过Ca ...

  8. 亚瑟王(bzoj 4008)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...

  9. CDQ分治模板

    #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #defi ...

  10. C#路径,文件,目录,I/O常见操作汇总

    原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 路径,文件,目录,I/O常见操作汇总 摘要:     文件操作是程序中非常基础和重要的内容,而路径、文件、目录以及 ...