Color Length UVA - 1625
题目大意:
给你两个字符串p,q,字符串中每个字符代表一个颜色,现在按顺序合并两个字符串,得到一个新字符串。新字符串的价值为,每个颜色价值的和,单个颜色价值的和等于该颜色在新字符中最后一次出现的位置减去第一次出现的位置。求最小价值
题目思路:
dp[i][j]代表使用p的前i个字符,q的前j个字符合并产生的价值。对于dp[i][j],可由dp[i-1][j],dp[i][j-1]转移得到,每次转移增加的价值为【已被填入,但尚未填完的颜色的个数】。
用c[][]维护当前已被填入但尚未被填完的颜色的数目,若一个颜色新加入就加一,若一个颜色被填完就减一。
由于dp[5000][5000]太大了,且每次转移仅与dp[i-1][j],dp[i][j-1]有关,我们可以采用滚动数组优化
#pragma GCC optimize(2)
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
#include<vector>
#include<math.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f int dp[][];
int c[][];
char s1[],s2[];
struct node
{
int s,e;
} p1[],p2[]; int main()
{
int n;
scanf("%d",&n);
//cout << (int) 'Y'-'A' << endl;
while(n--)
{
for(int i=; i<; i++)
{
p1[i].s = p2[i].s = INF;
p1[i].e = p2[i].e = -;
}
scanf("%s",s1+);
scanf("%s",s2+);
int l1 = strlen(s1+);
int l2 = strlen(s2+);
for(int i=; i<=l1; i++)
{
int id = s1[i] - 'A';
if(p1[id].s == INF)
p1[id].s = i;
p1[id].e = i;
}
for(int i=; i<=l2; i++)
{
int id = s2[i] - 'A';
if(p2[id].s == INF)
p2[id].s = i;
p2[id].e = i;
}
int t = ;
memset(c,,sizeof(c));
memset(dp,,sizeof(dp));
for(int i=; i<=l1; i++)
{
for(int j=; j<=l2; j++)
{
if(!i && !j)
continue;
int v1=INF,v2=INF;
if(i)
v1 = dp[t^][j] + c[t^][j];
if(j)
v2 = dp[t][j-] + c[t][j-];
dp[t][j] = min(v1,v2); if(i)
{
c[t][j] = c[t^][j];
if(p1[s1[i]-'A'].s == i && p2[s1[i]-'A'].s>j)
c[t][j]++;
if(p1[s1[i]-'A'].e == i && p2[s1[i]-'A'].e <= j)
c[t][j]--;
}
if(j)
{
c[t][j] = c[t][j-];
if(p2[s2[j]-'A'].s == j && p1[s2[j]-'A'].s>i)
c[t][j]++;
if(p2[s2[j]-'A'].e == j && p1[s2[j]-'A'].e <= i)
c[t][j]--;
}
}
t ^= ;
}
printf("%d\n",dp[t^][l2]);
}
return ;
}
Color Length UVA - 1625的更多相关文章
- Color Length UVA - 1625 DP
题目:题目链接 题意:输入两个长度分别为n和m的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部.对于每个颜色c来说,其跨度L(c)等于最大位置和最小位置之差,输出 ...
- 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(线性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
[Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...
- UVA 1625 "Color Length" (基础DP)
传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 ...
随机推荐
- tar命令解压jdk.tar.gz包 报错 gzip: stdin: not in gzip format
转自:https://blog.csdn.net/LL_zhuo/article/details/44173355 遇到和这篇博文一样的问题了.用wget 从oracle官网下载jdk, http:/ ...
- mysql case
1.table CREATE TABLE `lee`(`id` INT(10) NOT NULL auto_increment,`name` varchar(20) DEFAULT null,`bir ...
- 修改LINUX ROOT密码
Connecting to 10.10.70.22:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]' ...
- JS继承方式详解
js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...
- easyui layout 折叠之后显示标题
方法一:重载扩展panel收缩事件 (function($){ var buttonDir = {north:'down',south:'up',east:'left',west:'right'}; ...
- const 和 #define区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...
- c++ public protected private 继承
1:访问控制 1.1 public 这类型成员可以被类本身函数访问,也可以被外部创建的类对象调用.子类对象与子类内部可以访问 1.2 protected类型成员,只能被类本身函数访问.外部创建的类对象 ...
- SDUT 3398 数据结构实验之排序一:一趟快排
数据结构实验之排序一:一趟快排 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定N个长整 ...
- Python中list常用的10个基本方法----list的灰魔法
########################list 的常用的10个基本方法################################## list 类 列表# 1 列表的基本格式#2 可以 ...
- C++笔记--函数
函数的定义和声明 函数的声明和定义都必须描述相同的类型,但是声明可以不写参数名,定义则必须写参数名,但是他们的参数名字可以不同. 一个局部变量被声明为static,那么这个局部变量将只会被初始化一次, ...