思路还算明白,不过要落实到代码上还真敲不出来。

题意:

有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部。

对于每种颜色,其跨度定义为合并后的序列中最后一次和第一次出现的位置之差,求所有合并方案中所有颜色跨度之和的最小值。

分析:

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相关推荐

  1. UVA 1625 Color Length DP

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  2. UVA 1625—Color Length(ACM/ACPC Daejeon 2011)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. Uva 1625 - Color Length(DP)

    题目链接 https://cn.vjudge.net/problem/UVA-1625 [题意] 输入两个长度分别为n和m的颜色序列(n,m<=5000),要求按一定规则合并成一个序列,规则是每 ...

  4. uva 1625——Color Length

    题意:给定两个长度分别为n和m 的颜色序列,要求按顺序合并成一个序列,即每次可以把开头的颜色放到新序列末尾,跨度l(c)等于最大和最小的位置之差. 思路:递推,f(i,j)表示s1移走了i个元素,s2 ...

  5. 【Uva 1625】Color Length

    [Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...

  6. [UVa-437] Color Length

    计算贡献:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串$a$,$b$,将他们穿插起来(相对位置不变),要求最小化$\sum L(c)$,其中$L(c)$的定义时在穿插完 ...

  7. 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)

    原题链接:https://vjudge.net/problem/UVA-1625 分类:LCS型 备注:类似于LCS,指标函数的分解 hav[i][j]应该表示在串A取完i个字符和串B取完j个字符之后 ...

  8. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  9. 扑克牌排序_JAVA 扑克牌排序打印,并进行洗牌

    点击上方蓝字关注我们 一.Puke类: 首先定义扑克牌的参数 定义字符串型的花色(color),点数(points)两个有关于扑克牌的参数,且用private关键字进行修饰,被private修饰的后的 ...

最新文章

  1. mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
  2. Java洛谷P5461 赦免战俘讲解
  3. 中国充换电行业产销需求预测与转型升级战略分析报告2022-2028年版
  4. 1.1.4 错题知识整理(机器语言、汇编语言、正则语言、解释程序、编译、汇编)
  5. jmeter3.3—插件管理器的安装
  6. html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放
  7. css字体倾斜角度_css如何实现渐变效果?css背景色渐变与文字渐变效果的实现(代码实例)...
  8. 10个有关RESTful API良好设计的最佳实践
  9. 简单迁移vps服务器
  10. 什么是视频分配器 编码器
  11. SVD奇异值分解在推荐系统中的应用及实现
  12. java数据透视表_使用流实现Java数据透视表
  13. 2020-05-26
  14. ubuntu下CHM阅读器
  15. .net core添加word水印
  16. 小程序开发工具_小程序开发工具都有哪些?
  17. X509和CA的关系
  18. 现在学java好还是python好_县花一现的“现”是什么意思?
  19. Python爬虫三:抓取链家已成交二手房信息(58W数据)
  20. 什么是大数据公司面临的问题以及如何使用大数据解决

热门文章

  1. 【CSDN】设置图片大小
  2. 【若依(ruoyi)】Bootstrap-Table的使用
  3. 【微信小程序】 自定义导航栏(navigationStyle=custom)
  4. eclipse 设置 content type 编码格式
  5. 【maven】javaee项目添加servlet、jsp依赖
  6. PHP堆实现TopK算法实例,top-k 算法浅析
  7. html 中写样式,在html文档中如何定义内部样式表
  8. 松下a6伺服驱动连接光栅尺_FANUC常见伺服报警及故障解决方法
  9. 拍摄中如何判断灰度等级_如何判断电力铁塔的电压等级?每个人都应知道
  10. java程序设计_这份Java程序设计手册被刷爆了,1000G视频+50大项目+200面试题