1625 - Color Length——[动态规划]
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4500
题目分析:
本题要将两条路上的车辆混合成一路,混合方法可以是:每次将一个颜色序列中的开头颜色放入新序列的尾部。可以定义状态d[i][j]为第一个序列移走了i辆车,第2个序列移走了j辆车时,新序列的颜色长度。如何进行状态转移呢?
假设第一个序列为A[n],第二个序列为B[m],C[i][j]表示由A中前i个元素和B中前j个元素组成的最优新序列。下面我们考虑将颜色A[i]加入C[i-1][j]的情况。组成新序列的颜色可以分成两类:(1)已经出现还未结束的颜色 (2)已经结束的颜色 ,设第(1)类元素个数为s,那么将A[i]加入后,每个还未结束的颜色长度均要增加1,所以总长度为 d[i-1][j]+s。 这样我们就得到了状态转移方程 d[i][j]=min{d[i-1][j]+s1,d[i][j-1]+s2} ,s1为将A[i]加入C[i-1][j]的总长度增量,s2为将B[j]加入C[i][j-1]的总长度增量。
那么主要问题就转换成了如何计算C[i][j]中一景出现还未结束的颜色个数,可以对原先的两个序列预处理一遍,很容易在O(n*m)时间内计算出每个颜色开始和结束的位置。总时间复杂度为O(n*m)。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=;//5000; int d[maxn+][maxn+];
int b[][];
int e[][];
int L[];
char s1[maxn+];
char s2[maxn+];
int n,m;
void init(){ memset(L, , sizeof L);
memset(b, , sizeof b);
memset(e, , sizeof e);
}
void pre_process(){
for(int i=;i<n;i++){
char ch=s1[i];
int id=ch-'A';
if(b[][id]==){
b[][id]=i+;
}
}
for(int i=n-;i>=;i--){
char ch=s1[i];
int id=ch-'A';
if(e[][id]==){
e[][id]=i+;
}
}
for(int i=;i<m;i++){
char ch=s2[i];
int id=ch-'A';
if(b[][id]==){
b[][id]=i+;
}
}
for(int i=m-;i>=;i--){
char ch=s2[i];
int id=ch-'A';
if(e[][id]==){
e[][id]=i+;
}
}
}
int sum(int i,int j,int flag){
int ans=;
if(flag==){
for(int k=;k<;k++) {
if(((b[][k]>&&b[][k]<=i-)||(b[][k]>&&b[][k]<=j))&&((e[][k]>&&e[][k]>i-)||(e[][k]>&&e[][k]>j)))
ans++;
}
}
else {
for(int k=;k<;k++) {
if(((b[][k]>&&b[][k]<=i)||(b[][k]>&&b[][k]<=j-))&&((e[][k]>&&e[][k]>i)||(e[][k]>&&e[][k]>j-)))
ans++;
}
}
return ans;
} int main(int argc, const char * argv[]) {
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s",s1,s2);
n=strlen(s1);
m=strlen(s2);
init();
pre_process();
d[][]=;
for(int i=;i<=n;i++) d[i][]=d[i-][]+sum(i,,);
for(int j=;j<=m;j++) d[][j]=d[][j-]+sum(,j,);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
d[i][j]=min(d[i-][j]+sum(i,j,),d[i][j-]+sum(i,j,));
}
}
printf("%d\n",d[n][m]);
}
return ;
}
1625 - Color Length——[动态规划]的更多相关文章
- 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很想,计算这 ...
- 动态规划(模型转换):uvaoj 1625 Color Length
[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. #include <i ...
- UVa 1625 - Color Length(线性DP + 滚动数组)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 1625 Color Length
思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...
- UVa 1625 Color Length (DP)
题意:给定两个序列,让你组成一个新的序列,让两个相同字符的位置最大差之和最小.组成方式只能从一个序列前部拿出一个字符放到新序列中. 析:这个题状态表示和转移很容易想到,主要是在处理上面,dp[i][j ...
- UVA 1625 Color Length 颜色的长度 (预处理+dp)
dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费. 转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数 ...
- UVA 1625 "Color Length" (基础DP)
传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 ...
- Color Length UVA - 1625
题目大意: 给你两个字符串p,q,字符串中每个字符代表一个颜色,现在按顺序合并两个字符串,得到一个新字符串.新字符串的价值为,每个颜色价值的和,单个颜色价值的和等于该颜色在新字符中最后一次出现的位置减 ...
随机推荐
- JavaScript--clientX,clientY、pageX,pageY、offsetLeft,offsetTop/offsetWidth,offsetHeight、scrollLeft,scrollTop/scrollWidth,scrollHeight、clientHeight,clientWidth区别
/*在事件的内部console.dir(event)*/ /** * 事件对象event * clientX/clientY 获取鼠标基于浏览器窗口(可视区域的坐标位置)全兼容 * * pageX/p ...
- 【转载】【python】python练手项目
入门篇 1.Python - Python 图片转字符画 50 行 Python 代码完成图片转字符画小工具. <img src="https://pic3.zhimg.com ...
- 【转载】ubuntu下编写字符设备驱动程序-入门篇
在ubuntu初学驱动,觉得挺有用的. http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html
- Hibernate的DetachedCriteria使用(含Criteria)转载
https://www.cnblogs.com/deng-cc/p/6428599.html 1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC ...
- Spark day03
补充算子 transformations mapPartitionWithIndex 类似于mapPartitions,除此之外还会携带分区的索引值. repartition 增加或减少分区.会产生s ...
- 2019-8-31-C#-标准性能测试高级用法
title author date CreateTime categories C# 标准性能测试高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-07-08 0 ...
- closest和parents方法区别
今天第一次看到closest方法,以前也从来没用过. 该方法从元素本身开始往上查找,返回最近的匹配的祖先元素. 1.closest查找开始于自身,parents开始于元素父级 2.closest向上查 ...
- 简单利用XSS获取Cookie信息实例演示
简单利用XSS获取Cookie信息实例演示 首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高.随便 ...
- 【时光回溯】【JZOJ3571】【GDKOI2014】内存分配
题目描述 输入 输出 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位数. 样例输入 2 3 1 4 1 4 2 2 1 2 1 1 1 1 1 样例输出 2 3 1 数据范围 ...
- hdu2577 dp
也可以字符串搞.dp思路还是很清晰的.dp[][0]表示未锁定,dp[][1]表示锁定键. #include<stdio.h> #include<string.h> #defi ...