题意,有两个字符串,分别由四个字母构成,字母之间有不同的相似度,允许在两个字符串都按原顺序排列的情况下进行字母与字母之间的匹配,也可以让字母与空格匹配,即相当于在字符串中间加空格来一一匹配,每个字母与空格也有相应的相似度,但空格不能和空格匹配。问当给出两个字符串时,求它们的最大相似度。

我一开始的想法也是想类似于最长公共子序列的做法,只是将匹配数变成了一个权值,总的相似度。这个方向是正确的,但是我却在细节上犯了糊涂,我一直在考虑当第一条链的第 i 个和第二条的第 j 个相匹配,这样的情况,从前面的各种情况转移到这里。但事实上,其实原本就该想到,最长公共子序列的状态转移也是对于匹配完第一条的第 i 个和第二条的第 j 个,而不是这两个恰好匹配。这样做反而容易进行状态转移。

状态转移关系如下:

dp [ i ] [ j ] 表示匹配完第一条的第 i 个和第二条的第 j 个(均可以与空格进行匹配);

① dp [ i - 1 ] [ j ] + v (第一条第 i 个与空格匹配后增加的相似度) ,当该值大于 dp 原值时就用它优化 dp;

② dp [ i ] [ j - 1 ] + v (第二条第 j 个与空格匹配后增加的相似度) ,当该值大于 dp 原值时就用它优化 dp;

③ dp [ i - 1 ] [ j - 1 ] + v(第一条第 i 个与第二条第 j 个匹配后增加的相似度) ,当该值大于 dp 原值时就用它优化 dp;

这样就行了;

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#define max(a,b) a>b?a:b
#define INF 100000
using namespace std;
int v[][]={{,-,-,-,-},{-,,-,-,-},{-,-,,-,-},{-,-,-,,-},{-,-,-,-,}};
int dp[][];
int s1[],s2[]; int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int q=;q<=n;q++){
memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
int l1,l2;
scanf("%d",&l1);
int i,j;
getchar();
char a;
dp[][]=;
for(i=;i<=l1;i++){
a=getchar();
if(a=='A') s1[i]=;
else if(a=='C') s1[i]=;
else if(a=='G') s1[i]=;
else if(a=='T') s1[i]=;
dp[i][]=dp[i-][]+v[s1[i]][];
}
scanf("%d",&l2);
getchar();
for(i=;i<=l2;i++){
a=getchar();
if(a=='A') s2[i]=;
else if(a=='C') s2[i]=;
else if(a=='G') s2[i]=;
else if(a=='T') s2[i]=;
dp[][i]=dp[][i-]+v[][s2[i]];
}
int k;
/*
printf("s1:");
for(i=1;i<=l1;i++)printf("%d",s1[i]);
printf("\n");
printf("s2:");
for(i=1;i<=l2;i++)printf("%d",s2[i]);
printf("\n");
*/
for(i=;i<=l1;i++){
for(j=;j<=l2;j++){
dp[i][j]=-INF;
dp[i][j]=max(dp[i][j],dp[i-][j]+v[s1[i]][]);
dp[i][j]=max(dp[i][j],dp[i][j-]+v[][s2[j]]);
dp[i][j]=max(dp[i][j],dp[i-][j-]+v[s1[i]][s2[j]]);
}
}
printf("%d\n",dp[l1][l2]);
}
}
return ;
}

hdu1080 DP(类最长公共子序列)的更多相关文章

  1. hdu1243 dp (类最长公共子序列)

    题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...

  2. POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)

    本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...

  3. 51nod 1183 编辑距离【线性dp+类似最长公共子序列】

    1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...

  4. hdu 1080 dp(最长公共子序列变形)

    题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G -  G ...

  5. dp(最长公共子序列)

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...

  6. 1. 线性DP 1143. 最长公共子序列

    最经典双串: 1143. 最长公共子序列 (LCS)  https://leetcode-cn.com/problems/longest-common-subsequence/submissions/ ...

  7. Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)

    题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...

  8. [dp]LCS最长公共子序列

    https://www.51nod.com/tutorial/course.html#!courseId=4 复杂度:${\rm O}(nm)$ 转移方程: #include<bits/stdc ...

  9. 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)

    目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...

随机推荐

  1. Java 包的概述和讲解

    2017-11-02 22:58:45 包(package):其实就是文件夹. 包的作用是对类进行分类的管理,并且区分不同的类名. 举例: 学生:增加,删除,修改,查询 教师:增加,删除,修改,查询 ...

  2. SVN使用流程

  3. mysql 将一张表里的数据插入到另一张表

    1. 表结构一样 insert into 表1 select * from 表2 2. 表结构不一样 insert into 表1 (列名1,列名2,列名3) select 列1,列2,列3 from ...

  4. 很实用且容易忘记的小命令 for Linux(更新中...)

    系统相关 # 系统安装日期 sudo tune2fs -l /dev/sda1 |grep create # 查看centos版本命令 rpm -q centos-release #查看centos版 ...

  5. English trip -- VC(情景课)1 B Countries

    Vocabulary focus 核心词汇 Vo ca bu la ry   fo cus [və(ʊ)'kæbjʊlərɪ]      ['fəʊkəs] Listen and repeat  听并 ...

  6. C++&C#外挂(内存修改)

    大学时候因为主修C#语言(当然现在做的是javaweb开发),那时在网上学了用C#做外挂的教程,外挂嘛,大家都懂的.这里只是低级的修改内存,不涉及到截获数据包.如果是欺骗服务器,修改服务器数据,那就难 ...

  7. php-fpm.conf配置文件中文说明详解及重要参数说明

    摘自:https://www.jb51.net/article/148550.htm 感谢分享 php-fpm工作流程 php-fpm全名是PHP FastCGI进程管理器 php-fpm启动后会先读 ...

  8. unittest参数化

    我们在写case的时候,如果用例的操作是一样的,就是参数不同,比如说要测一个登陆的接口,要测正常登陆的.黑名单用户登陆的.账号密码错误的等等,在unittest里面就要写多个case来测试. 这样的情 ...

  9. hdu-1892-二维BIT

    See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...

  10. Idea破解办法+idea免费生成注册码+jsp属性选择器+注解什么的都报错

    Idea破解办法: http://blog.csdn.net/bitcarmanlee/article/details/54951589 idea免费生成注册码: http://idea.iteblo ...