UVa 1625 Color Length
思路还算明白,不过要落实到代码上还真敲不出来。
题意:
有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部。
对于每种颜色,其跨度定义为合并后的序列中最后一次和第一次出现的位置之差,求所有合并方案中所有颜色跨度之和的最小值。
分析:
d(i, j)表示两个串分别已经移走了i个和j个字符。那么无论新串的顺序是什么,有多少种颜色已经开始但尚未结束是确定的,记为c(i, j)。再继续移走一个字符,所有颜色跨度之和就增加c(i, j)。c的计算是通过记录每种颜色在每个串的始末位置来确定的。
由于数据量较大,还用滚动数组来优化空间复杂度。
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 5000 + 10; 9 const int INF = 1000000000; 10 char p[maxn], q[maxn]; 11 int sp[26], ep[26], sq[26], eq[26]; //记录两个串每种颜色的始末 12 int d[2][maxn], c[2][maxn]; //c[i][j]表示d[i][j]时还有多少种颜色已经开始但尚未结束 13 14 int main(void) 15 { 16 #ifdef LOCAL 17 freopen("1625in.txt", "r", stdin); 18 #endif 19 20 int n, m, T; 21 scanf("%d", &T); 22 while(T--) 23 { 24 scanf("%s", p+1); 25 scanf("%s", q+1); 26 n = strlen(p+1); 27 m = strlen(q+1); 28 for(int i = 1; i <= n; ++i) p[i] -= 'A'; 29 for(int i = 1; i <= m; ++i) q[i] -= 'A'; 30 31 for(int i = 0; i < 26; ++i) { sp[i] = sq[i] = INF; ep[i] = eq[i] = 0; } 32 for(int i = 1; i <= n; ++i) 33 { 34 sp[p[i]] = min(sp[p[i]], i); 35 ep[p[i]] = i; 36 } 37 for(int i = 1; i <= m; ++i) 38 { 39 sq[q[i]] = min(sq[q[i]], i); 40 eq[q[i]] = i; 41 } 42 43 int t = 0; 44 memset(d, 0, sizeof(d)); 45 memset(c, 0, sizeof(c)); 46 for(int i = 0; i <= n; ++i) 47 { 48 for(int j = 0; j <= m; ++j) 49 { 50 if(!i && !j) continue; 51 52 int v1, v2; 53 v1 = v2 = INF; 54 if(i) v1 = d[t^1][j] + c[t^1][j]; 55 if(j) v2 = d[t][j-1] + c[t][j-1]; 56 d[t][j] = min(v1, v2); 57 //计算c 58 if(i) 59 { 60 c[t][j] = c[t^1][j]; 61 if(sp[p[i]] == i && sq[p[i]] > j) c[t][j]++; 62 if(ep[p[i]] == i && eq[p[i]] <= j) c[t][j]--; 63 } 64 else if(j) 65 { 66 c[t][j] = c[t][j-1]; 67 if(sq[q[j]] == j && sp[q[j]] > i) c[t][j]++; 68 if(eq[q[j]] == j && ep[q[j]] <= i) c[t][j]--; 69 } 70 } 71 t ^= 1; 72 } 73 printf("%d\n", d[t^1][m]); 74 } 75 76 return 0; 77 }
代码君
转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4006498.html
UVa 1625 Color Length相关推荐
- UVA 1625 Color Length DP
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
- UVA 1625—Color Length(ACM/ACPC Daejeon 2011)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Uva 1625 - Color Length(DP)
题目链接 https://cn.vjudge.net/problem/UVA-1625 [题意] 输入两个长度分别为n和m的颜色序列(n,m<=5000),要求按一定规则合并成一个序列,规则是每 ...
- uva 1625——Color Length
题意:给定两个长度分别为n和m 的颜色序列,要求按顺序合并成一个序列,即每次可以把开头的颜色放到新序列末尾,跨度l(c)等于最大和最小的位置之差. 思路:递推,f(i,j)表示s1移走了i个元素,s2 ...
- 【Uva 1625】Color Length
[Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...
- [UVa-437] Color Length
计算贡献:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串$a$,$b$,将他们穿插起来(相对位置不变),要求最小化$\sum L(c)$,其中$L(c)$的定义时在穿插完 ...
- 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
原题链接:https://vjudge.net/problem/UVA-1625 分类:LCS型 备注:类似于LCS,指标函数的分解 hav[i][j]应该表示在串A取完i个字符和串B取完j个字符之后 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- 扑克牌排序_JAVA 扑克牌排序打印,并进行洗牌
点击上方蓝字关注我们 一.Puke类: 首先定义扑克牌的参数 定义字符串型的花色(color),点数(points)两个有关于扑克牌的参数,且用private关键字进行修饰,被private修饰的后的 ...
最新文章
- mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
- Java洛谷P5461 赦免战俘讲解
- 中国充换电行业产销需求预测与转型升级战略分析报告2022-2028年版
- 1.1.4 错题知识整理(机器语言、汇编语言、正则语言、解释程序、编译、汇编)
- jmeter3.3—插件管理器的安装
- html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放
- css字体倾斜角度_css如何实现渐变效果?css背景色渐变与文字渐变效果的实现(代码实例)...
- 10个有关RESTful API良好设计的最佳实践
- 简单迁移vps服务器
- 什么是视频分配器 编码器
- SVD奇异值分解在推荐系统中的应用及实现
- java数据透视表_使用流实现Java数据透视表
- 2020-05-26
- ubuntu下CHM阅读器
- .net core添加word水印
- 小程序开发工具_小程序开发工具都有哪些?
- X509和CA的关系
- 现在学java好还是python好_县花一现的“现”是什么意思?
- Python爬虫三:抓取链家已成交二手房信息(58W数据)
- 什么是大数据公司面临的问题以及如何使用大数据解决
热门文章
- 【CSDN】设置图片大小
- 【若依(ruoyi)】Bootstrap-Table的使用
- 【微信小程序】 自定义导航栏(navigationStyle=custom)
- eclipse 设置 content type 编码格式
- 【maven】javaee项目添加servlet、jsp依赖
- PHP堆实现TopK算法实例,top-k 算法浅析
- html 中写样式,在html文档中如何定义内部样式表
- 松下a6伺服驱动连接光栅尺_FANUC常见伺服报警及故障解决方法
- 拍摄中如何判断灰度等级_如何判断电力铁塔的电压等级?每个人都应知道
- java程序设计_这份Java程序设计手册被刷爆了,1000G视频+50大项目+200面试题