uva live 4394 String painter 区间dp
- // 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的更多相关文章
- uva live 4394 String painter 间隔dp
// uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...
- hdu2476 String painter(区间dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2476 Problem Description There are two strings ...
- HDU2476 String painter —— 区间DP
题目链接:https://vjudge.net/problem/HDU-2476 String painter Time Limit: 5000/2000 MS (Java/Others) Me ...
- HDU2476 String painter——区间DP
题意:要把a串变成b串,每操作一次,可以使a串的[l,r]区间变为相同的一个字符.问把a变成b最少操作几次. 这题写法明显是区间dp ,关键是处理的方法. dp[l][r]表示b串的l~r区段至少需要 ...
- HDU 2476 String painter(区间dp)
题意: 给定两个字符串,让求最少的变化次数从第一个串变到第二个串 思路: 区间dp, 直接考虑两个串的话太困难,就只考虑第二个串,求从空白串变到第二个串的最小次数,dp[i][j] 表示i->j ...
- HDU 2476 String painter(区间DP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...
- hdu 2476"String painter"(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...
- UVA Live Archive 4394 String painter(区间dp)
区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...
- hdu_2476_String painter(区间DP)
题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...
随机推荐
- JS实现两版本号大小比较
JavaScript实现版本号比对(含字母) 昨天,有一道面试题,要求是这样的: 用你熟悉的编程语言,实现一个比较任意两个软件版本号大小的函数,如1.2.3a与1.2.4b进行比较,后者版本号更大,要 ...
- 【简●解】[ZJOI2005]午餐
[简●解][ZJOI2005]午餐 [关键词] \(DP\) 排序/贪心 [分析] 首先,一个很明显的贪心思路,就是吃的慢的人先打饭.所以把数据按吃饭时间从大到小排一遍序. 根据\(dp\)的尿性,比 ...
- 【Python基础】迭代器、生成器
迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...
- laravel(4.2) +Zizaco
操作步骤:https://github.com/Zizaco/entrust/tree/1.0 这篇博客说的蛮详细的:http://blog.boolw.com/?p=241 简化后的步骤 1.在根项 ...
- Python编译错误总结
1.TypeError: object() takes no parameters 如果你出现了这个报错,请检查你的__init__函数名或者其定义有没有写错.一般是把__init__写成了__int ...
- HDU 5468 Puzzled Elena
Puzzled Elena Time Limit: 2500ms Memory Limit: 131072KB This problem will be judged on HDU. Original ...
- [BZOJ4207]Can
[BZOJ4207]Can 试题描述 这个问题是源于一个在棋盘上玩的,由Sid Sackson设计的名叫Can't stop的游戏的.这个问题与Can't stop有一定的相似之处,但是不需要玩过Ca ...
- 亚瑟王(bzoj 4008)
Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 亮.众所周知,亚瑟王是一 ...
- CDQ分治模板
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #defi ...
- C#路径,文件,目录,I/O常见操作汇总
原文发布时间为:2008-10-25 -- 来源于本人的百度文章 [由搬家工具导入] 路径,文件,目录,I/O常见操作汇总 摘要: 文件操作是程序中非常基础和重要的内容,而路径、文件、目录以及 ...