// uva live 4394 String painter
//
// 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂
// A A磕磕磕,两个半小时后,。发现超过例子。然而,鉴于他们跪在数据
// 还要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. LA 4394 String painter 区间DP -

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

  2. UVALive 4394 String painter

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

  3. 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, ...

  4. HDU-2476 String painter 区间DP

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

  5. HDU2476:String painter(区间dp)

    原文地址:http://blog.csdn.net/a601025382s/article/details/12379565 原文作者:knownothing String painter Time ...

  6. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  7. 动态规划训练11 [String painter HDU - 2476]

    String painter HDU - 2476 题意: 我认为这是一道比较难的问题,自己想了很久,没有想出来怎么做,可能是因为思维僵化吧,一直在想怎么直接的由A变到B,事实上,可以有中间桥梁连接A ...

  8. HDU 2476 String painter (区间DP)

    题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...

  9. UVa11022 String Factoring(kmp+dp)

    用dp(i,j)表示子串s[i..j]可以表示的最小长度.动态转移方程有 dp(i,j) = min{dp(i,k) + dp(k+1,j)},其中k属于[i,j].s[i..j]是周期串,最小周期为 ...

最新文章

  1. IT项目十大灾难(转载)
  2. maven配置阿里云_阿里云OSS PicGo 配置图床教程 超详细
  3. 【剪枝算法】通过网络瘦身学习高效的卷积网络Learning Efficient Convolutional Networks through Network Slimming论文翻译
  4. 数学建模清风第二次直播:模拟退火算法
  5. 一个分页效果ruby版可作为面试题吧
  6. 蓝桥杯每日真题之货物摆放
  7. 大规模虚拟化,舍我其谁?
  8. css中正确设置微软雅黑字体
  9. Word2010为图片批量插入题注
  10. 顶级域名、一级域名、二级域名、子页面
  11. JS 案例 个人所得税计算器
  12. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  13. html 文字段后间距怎么设置,p字间距 html段落内文字设置字间距间隔
  14. 1.7亿条数据,比胡同和撸串更真实的北京
  15. 同行:成长路上的三人行
  16. 如何在eclipse中导入Java项目文件包(方法截图详细步骤)
  17. matlab 棋盘格畸变矫正
  18. 电脑怎么搜索重复文件?如何快速找到重复文件?
  19. VVC/VSEI 高层语法
  20. 2023年全网最详细入门网络安全(黑客)教程,收藏这个就够了

热门文章

  1. 解决报错: MobaXterm X11 proxy: Unsupported authorisation protocol
  2. Future有返回值的线程
  3. 【Spring boot 实战】使用Maven插件构建Docker镜像
  4. android中的json二之json的读写
  5. 大佬教你修改pycharm编辑器 简单的四步教你搞定界面风格修改
  6. redis php数据插入失败,redis插入数据,恢复数据测试(禁止淘汰策略下恢复大于redis内存限制数据情况)...
  7. mysql存储登录密码_当密码存储在选项文件中时,MySQL拒绝登录尝试
  8. web 平台搭建-LNMP-源码包(CentOS-6)
  9. carbon 一天的开始 结束_情话文案:朋友圈背景图丨2020国庆最后一天朋友圈的说说文案 修炼七天的你,是否准备就绪?...
  10. centos格式化优盘命令_centos 磁盘分区、格式化及挂载