[PDF Link]题目点这里

  这道题一眼就是动态规划,然而貌似并不好做。

  如果不转换模型,状态是难以处理的。

  巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中。

 #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的更多相关文章

  1. UVA - 1625 Color Length[序列DP 代价计算技巧]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  2. UVA - 1625 Color Length[序列DP 提前计算代价]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  3. 1625 - Color Length——[动态规划]

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

  4. UVa 1625 - Color Length(线性DP + 滚动数组)

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

  5. UVa 1625 Color Length

    思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...

  6. UVa 1625 Color Length (DP)

    题意:给定两个序列,让你组成一个新的序列,让两个相同字符的位置最大差之和最小.组成方式只能从一个序列前部拿出一个字符放到新序列中. 析:这个题状态表示和转移很容易想到,主要是在处理上面,dp[i][j ...

  7. UVA 1625 Color Length 颜色的长度 (预处理+dp)

    dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费. 转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数 ...

  8. UVA 1625 "Color Length" (基础DP)

    传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 ...

  9. 前端MVVM框架avalon - 模型转换1

    轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...

随机推荐

  1. c#参数传递使用中的一个坑,值传递与引用传递

    c#参数传递使用中发现的一个问题 写了3个重载方法,把 对象.int .(int直接封入object) 传入SWAP方法进行数据操作结果对象内的数据发生了改变,其他2个没有:

  2. 快速记忆JavaScript中exec和match的使用

    JS模式匹配中exec,match用得非常多,所以掌握其用法对我们进行字符串的处理帮助非常大 1.exec的定义其用法        exec与match主要的不同是,exec是正则表达式里面的方法. ...

  3. 样式单位之px、em、rem

    最近在看bootstrap.css的时候看到很多单位都用到rem而不是熟系的px.经学习得知: 1.px精确的单位: 2.em为相对单位(相对父级元素) 3.rem为相对单位(相对根元素 html)

  4. Java中JIN机制及System.loadLibrary() 的执行过程

    Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平 ...

  5. JavaScript学习笔记--ES6学习(五) 数值的扩展

    ES6 对于数值类型 (Number) 进行了一下扩展: 1.对于二进制和八进制提供了新的写法 ES6对于二进制和八进制的数值提供了新的写法,分别用0b (或者0B) 和0o (或者0o) 表示.例如 ...

  6. iframe的缺点与优点?

    iframe是一种框架,也是一种很常见的网页嵌入方式. iframe的优点: iframe能够原封不动的把嵌入的网页展现出来. 如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可 ...

  7. Java-生成验证码图片(自定义内容,尺寸,路径)

    1 package cn.gp.tools; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; imp ...

  8. php 备份数据库脚本

    <?php// 备份数据库$host = "localhost";$user = "root"; //数据库账号$password = "123 ...

  9. [Client]动检参数讨论与ONVIF

    [问题]客户端访问ONVIF设备动检 客户端要访问ONVIF设备(IPC)的动检,一是事件,二是设置: 此处就是讨论如何设置动检区域的. 通过Video Analytics/Cell Motion D ...

  10. InvalidArgument=Value of '1' is not valid for 'index'

    用ListView实现点击ListView的项删除该项的效果,调用ItemSelectionChanged事件. 代码如下: private void listView1_ItemSelectionC ...