动态规划(模型转换):uvaoj 1625 Color Length
这道题一眼就是动态规划,然而貌似并不好做。
如果不转换模型,状态是难以处理的。
巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
char s1[maxn],s2[maxn];
int B1[],E1[],B2[],E2[];
int dp[maxn][maxn];
int add[maxn][maxn];
int main(){
int T,len1,len2;
scanf("%d",&T);
while(T--){
scanf("%s",s1+);
scanf("%s",s2+);
len1=strlen(s1+);
len2=strlen(s2+);
memset(B1,,sizeof(B1));
memset(E1,-,sizeof(E1));
memset(B2,,sizeof(B2));
memset(E2,-,sizeof(E2));
for(int i=;i<=len1;i++){
s1[i]-='A';
if(B1[s1[i]]>len1)B1[s1[i]]=i;
E1[s1[i]]=i;
} for(int i=;i<=len2;i++){
s2[i]-='A';
if(B2[s2[i]]>len2)B2[s2[i]]=i;
E2[s2[i]]=i;
} for(int i=;i<=len1;i++)
for(int j=;j<=len2;j++){
if(i==j&&i==)continue;
if(!i||j&&dp[i][j-]+add[i][j-]<=dp[i-][j]+add[i-][j]){
dp[i][j]=dp[i][j-]+add[i][j-];
add[i][j]=add[i][j-];
if(B2[s2[j]]==j&&B1[s2[j]]>i)
add[i][j]++;
if(E2[s2[j]]==j&&E1[s2[j]]<=i)
add[i][j]--;
}
if(!j||i&&dp[i][j-]+add[i][j-]>dp[i-][j]+add[i-][j]){
dp[i][j]=dp[i-][j]+add[i-][j];
add[i][j]=add[i-][j];
if(B1[s1[i]]==i&&B2[s1[i]]>j)
add[i][j]++;
if(E1[s1[i]]==i&&E2[s1[i]]<=j)
add[i][j]--;
}
}
printf("%d\n",dp[len1][len2]);
}
return ;
}
动态规划(模型转换):uvaoj 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很想,计算这 ...
- 1625 - Color Length——[动态规划]
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 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 表示,第二个用串 ...
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...
随机推荐
- Weex 初始
1.一旦数据和模板绑定,数据的变化会立即体现在前台的变化 <template> <container> <text style="font-size: {{si ...
- ab安装和使用
apache bench(专门用于 HTTP Server .单url).win8: 下载地址:http://httpd.apache.org/download.cgi#apache24 安装apac ...
- APNs改动 (转)
对 APNs 的吐槽 APNs 是 Apple Push Notification service 的简称(注意 APNs 的大小写, s不需要大写). 以下是我收集的一些关于 APNs 的吐槽,你先 ...
- Moving a Subversion Repository to Another Server
Moving a subversion repository from one server to another, while still preserving all your version h ...
- javascript事件详解1
事件流讲解来袭,嘎嘎嘎嘎嘎 ---------------------------------------------------------------- 1.事件流:描述的是在页面中接受事件的顺序 ...
- PHP 用Class构造JSON数据
header('Content-type: appliction/json; charset=shift-JIS'); // error //{ // "result": fals ...
- linux防火墙解封某端口
首先,使用netstat –tunlp查看是否23端口被防火墙封掉了: 再使用iptables修改设置, # iptables -I INPUT -p tcp --dport 23 –jACCEPT ...
- ROW_NUMBER() OVER函数的基本用法用法
ROW_NUMBER() OVER函数的基本用法用法 转自:http://www.cnblogs.com/icebutterfly/archive/2009/08/05/1539657.html 语法 ...
- VB.NET中LINQ TO List泛型查询语句(分组,聚合函数)
Public Class LinqToList 'LINQ在C#中使用比较方便,但是在VB中使用比较麻烦,复杂,和C#用法并不太一样 Dim listNew As List(Of Product) = ...
- php笔记之GD库图片创建/简单验证码
燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it php画图:比如说验证码,缩略图,加水印都要用到GD库,所以要开启gd2库,才能用 首先找到php.in ...