uva live 4394 String painter 间隔dp
- // 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的更多相关文章
- uva live 4394 String painter 区间dp
// uva live 4394 String painter // // 这一题是训练指南上dp专题的习题,初看之下认为仅仅是稍微复杂了一点 // 就敲阿敲阿敲,两个半小时后,发现例子过了.然而自己 ...
- 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 ...
- UVA Live Archive 4394 String painter(区间dp)
区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...
- UVALive 4394 String painter ——(区间DP)
其实这个dp过程有点似懂非懂...代码如下: #include <stdio.h> #include <algorithm> #include <string.h> ...
- HDU2476 String painter——区间DP
题意:要把a串变成b串,每操作一次,可以使a串的[l,r]区间变为相同的一个字符.问把a变成b最少操作几次. 这题写法明显是区间dp ,关键是处理的方法. dp[l][r]表示b串的l~r区段至少需要 ...
- HDU 2476 String painter(区间DP+思维)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...
- HDU 2476 String painter(区间dp)
题意: 给定两个字符串,让求最少的变化次数从第一个串变到第二个串 思路: 区间dp, 直接考虑两个串的话太困难,就只考虑第二个串,求从空白串变到第二个串的最小次数,dp[i][j] 表示i->j ...
- UVALive 4394 String painter
这题搞了很久很久..弄得我都不想放上来了,但是想了想还是写上来吧,万一以后忘了怎么做了,又得搞很久很久了.题目是要求把一个字符串变成另外一个,每次可以选择一段字符串变成同一个字符,问最少用变多少次.本 ...
随机推荐
- POJ 1862 & ZOJ 1543 Stripies(贪心 | 优先队列)
题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- Ubuntu下安装MySQL 5.6.23
Ubuntu下安装MySQL 5.6.23 1.下载相应Linux-generic的源代码包.解压,将解压后的文件夹重命名为mysql.移动到/usr/local文件夹下: tar –xzf mysq ...
- 11.4.2 排序或合并文件(sort命令) - 51CTO.COM
11.4.2 排序或合并文件(sort命令) - 51CTO.COM 11.4.2 排序或合并文件(sort命令) 2010-03-12 14:37 陆松年 电子工业出版社 我要评论(0) 字号:T ...
- 安卓MP3播放器开发实例(1)之音乐列表界面
学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...
- Python 实现的下载op海贼王网的图片(网络爬虫)
没得事就爬一下我喜欢的海贼王上的图片 须要在d盘下建立一个imgcache目录 # -*- coding: utf-8 -*- import urllib import urllib2 import ...
- cocos2d-x3.2下使用Umeng 64位SDK注意事项
友盟官方的样例中已经有了Cocos2d-x的Demo使用起来也是比較方便的.但在64位的版本号使用时须要注意 32位SDK改动: 将Xcode中Build Settings的Architectures ...
- Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
项目地址: https://github.com/bitjjj/android-font-awesome-4.2-icon-pngs
- jQuery选择器实现隔行变色和使用javaScript实现隔行变色
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <!--什么是选择器? jQuery选择器继承了 ...
- VSTO学习笔记(二)Excel对象模型
原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...
- wwwtyro/cellophane
wwwtyro/cellophane A dead simple web terminal that gets all of the boilerplate out of the way and le ...