1. // uva live 4394 String painter
  2. //
  3. // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂
  4. // A A磕磕磕,两个半小时后,。发现超过例子。然而,鉴于他们跪在数据
  5. // 还要wa。才发现,自己的方法是有问题的,假设是将两个串同一时候考虑
  6. // 的话。比方: dp[i][j] 表示从i到j,s串刷成目标b串所须要的最小的花费
  7. // 然后依据区间的端点的字符特点,进行状态转移。然而可能是我太搓了。
  8. // 发现这种状态转移是不正确的,比方edc和cde。依照我d方法算出来是3,
  9. // 这时。我想到了先处理出假设 d[i][i] = (s[i]==b[i]) ?
  10.  
  11. 0 : 1,这样处理
  12. // 出来确实是2,然而对于例子
  13. // zzzzzfzzzzz
  14. // abcdefedcba
  15. // 显然,依照我的方法是5,默认f不用刷。
  16. //
  17. // 细致想来,假设状态是这样定义的话。那么状态转移就会非常麻烦,由于后面
  18. // 的状态可能并非当前状态所能转移过去的。要加上额外的开销。至于这个
  19. // 开销是什么,我依旧没弄明确,假设有大神能指点一二,那小子双手奉上
  20. // 2.56$,并致以最为诚挚的感激。
  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专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...

  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. UVA Live Archive 4394 String painter(区间dp)

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

  5. UVALive 4394 String painter ——(区间DP)

    其实这个dp过程有点似懂非懂...代码如下: #include <stdio.h> #include <algorithm> #include <string.h> ...

  6. HDU2476 String painter——区间DP

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

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

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

  8. HDU 2476 String painter(区间dp)

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

  9. UVALive 4394 String painter

    这题搞了很久很久..弄得我都不想放上来了,但是想了想还是写上来吧,万一以后忘了怎么做了,又得搞很久很久了.题目是要求把一个字符串变成另外一个,每次可以选择一段字符串变成同一个字符,问最少用变多少次.本 ...

随机推荐

  1. POJ 1862 &amp; ZOJ 1543 Stripies(贪心 | 优先队列)

    题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  2. Ubuntu下安装MySQL 5.6.23

    Ubuntu下安装MySQL 5.6.23 1.下载相应Linux-generic的源代码包.解压,将解压后的文件夹重命名为mysql.移动到/usr/local文件夹下: tar –xzf mysq ...

  3. 11.4.2 排序或合并文件(sort命令) - 51CTO.COM

    11.4.2 排序或合并文件(sort命令) - 51CTO.COM 11.4.2 排序或合并文件(sort命令) 2010-03-12 14:37 陆松年 电子工业出版社 我要评论(0) 字号:T ...

  4. 安卓MP3播放器开发实例(1)之音乐列表界面

    学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...

  5. Python 实现的下载op海贼王网的图片(网络爬虫)

    没得事就爬一下我喜欢的海贼王上的图片 须要在d盘下建立一个imgcache目录 # -*- coding: utf-8 -*- import urllib import urllib2 import ...

  6. cocos2d-x3.2下使用Umeng 64位SDK注意事项

    友盟官方的样例中已经有了Cocos2d-x的Demo使用起来也是比較方便的.但在64位的版本号使用时须要注意 32位SDK改动: 将Xcode中Build Settings的Architectures ...

  7. Android font-awesome 4.2 icons png(包含holo-light和holo-dark)

    项目地址: https://github.com/bitjjj/android-font-awesome-4.2-icon-pngs

  8. jQuery选择器实现隔行变色和使用javaScript实现隔行变色

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!--什么是选择器? jQuery选择器继承了 ...

  9. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  10. wwwtyro/cellophane

    wwwtyro/cellophane A dead simple web terminal that gets all of the boilerplate out of the way and le ...