Color Length UVALive - 5841
题文:见网页:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3852,(紫书p276)
题解:
这个题目统计答案,或者说状态的转移十分巧妙,我们想如果设dp[i][j]表示一号串到了第i位,二号串到了第j位的最小话费,显然还要记一下最开始放入这个字母的位置,十分不好写对不对,并且也状压不下。
那么我们可以考虑,对于一个状态dp[i][j],我们不最后来算他是多少,我们可以一边加,一边判断,看前面有那些字母已经出现了,并且后面还有这个字母,那么显然对于每个这种字母,都要有1的花费,所以,这个题目就变成了如何维护当前满足上述定义的字母的个数,这个我们主要分类讨论一下就可以了,具体实现看代码吧。
代码:(其实可以不用滚动数组)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#define ll long long
const int MAXN=;
const int inf=<<;
using namespace std;
int dp[][MAXN],c[][MAXN];
int op1[],ed1[],op2[],ed2[];
int n,m;
char x[MAXN],y[MAXN];
int main(){
int t;scanf("%d",&t);
while(t--){
memset(dp,,sizeof(dp));
memset(c,,sizeof(c));
scanf("%s%s",x+,y+);
int n=strlen(x+),m=strlen(y+);
for(int i=;i<=n;i++) x[i]-='A';
for(int i=;i<=m;i++) y[i]-='A';
memset(op1,,sizeof(op1));
memset(op2,,sizeof(op2));
memset(ed1,,sizeof(ed1));
memset(ed2,,sizeof(ed2));
for(int i=;i<=n;i++){
op1[x[i]]=min(op1[x[i]],i);
ed1[x[i]]=i;
}
for(int i=;i<=m;i++){
op2[y[i]]=min(op2[y[i]],i);
ed2[y[i]]=i;
}
int now=,last=;dp[][]=;
for(int i=;i<=n;i++){
now^=,last^=;
memset(dp[now],,sizeof(now));
memset(c[now],,sizeof(now));
for(int j=;j<=m;j++){
if(!i&&!j) continue;
int v1=inf,v2=inf;
if(j) v1=dp[now][j-]+c[now][j-];
if(i) v2=dp[last][j]+c[last][j];
dp[now][j]=min(v1,v2);
if(i){
c[now][j]=c[last][j];
if(op1[x[i]]==i&&op2[x[i]]>j) c[now][j]++;
if(ed1[x[i]]==i&&ed2[x[i]]<=j) c[now][j]--;
}
else if(j){
c[now][j]=c[now][j-];
if(op2[y[j]]==j&&op1[y[j]]>i) c[now][j]++;
if(ed2[y[j]]==j&&ed1[y[j]]<=i) c[now][j]--;
}
}
}
printf("%d\n",dp[now][m]);
}
}
Color Length UVALive - 5841的更多相关文章
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- UVA - 1625 Color Length[序列DP 提前计算代价]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- UVa 1625 Color Length
思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...
- Color Length
题意: 给出两个字符串,求把两字符串组成一个字符串使的字符串中的相同字母的最远距离的和最小. 分析: 本题关键在于怎么计算距离和的方法上.dp[i][j]表示处理到长度i的a串,长度j的b串还需要的计 ...
- 动态规划(模型转换):uvaoj 1625 Color Length
[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. #include <i ...
- [UVa-437] Color Length
无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串a,b,可以将他们穿插起来(相对位置不变).要求最小化ΣL(c),其中 ...
- UVa 1625 - Color Length(线性DP + 滚动数组)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 1625 Color Length (DP)
题意:给定两个序列,让你组成一个新的序列,让两个相同字符的位置最大差之和最小.组成方式只能从一个序列前部拿出一个字符放到新序列中. 析:这个题状态表示和转移很容易想到,主要是在处理上面,dp[i][j ...
- [UVA1625]Color Length
题面在这里 description 输入两个长度分别为\(n\)和\(m\)的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部. 对于每个颜色\(c\)来说,其跨度 ...
随机推荐
- 【Nginx】 中的配置命令
一.location 1.1 概述 1.2 location的语法 1.3 Location正则案例 二.nginx rewrite 2.1 rewrite全局变量 2.2 判断IP地址来源 2.3 ...
- 063 Python必备库-从人机交互到艺术设计
目录 一.概述 二.Python库之图形用户界面 2.1 PyQt5 2.2 wxPython 2.3 PyGObject 三.Python库之游戏开发 3.1 PyGame 3.2 Panda3D ...
- 获取不到jdbc.driver的值解决办法
我存在的问题是: 1.先检查自己是否出错 ①首先想到mysql版本和驱动版本之间的冲突问题,我的mysql是5.5.56,驱动用的5.1.32,上网查了一下可以用,但还是尝试换了一个版本的驱动,还是出 ...
- 剑指offer(五):用两个栈实现一个队列
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...
- 选择正确的 Fragment#commitXXX() 函数
转自: http://www.tuicool.com/articles/q6R7nii 最新版本(v24.0.0)的 Support v4 库中的 FragmentTransaction 添加了 co ...
- kafka入门配置
问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? ...
- out.print()与response.sendRedirect()
这样的情况下 out.print("<script>alert('非法操作,请重新登录!');</script>"); response.sendRedir ...
- String、StringBuffer、StringBulider的区别
1.线程安全性: 线程安全:String.StringBuffer 线程不安全:StringBulider 2.执行效率 StringBulider最快,Stringbuffer次之,String最差 ...
- Java第三次作业第一题
1.[请复制本程序,作为java程序代码,进行编译,补充填写缺失代码部分,并实现题目要求功能,从而获得空白填写所需的内容.] 编写无限计时程序,从0:1开始计时,一直循环计时,计时到60秒,变为1:0 ...
- 04.Django基础四之模板系统
一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二 变量 在Django的模板语言中按此语法使用:{ ...