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

我一开始的想法也是想类似于最长公共子序列的做法,只是将匹配数变成了一个权值,总的相似度。这个方向是正确的,但是我却在细节上犯了糊涂,我一直在考虑当第一条链的第 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. 云服务器ECS挖矿木马病毒处理和解决方案

    云服务器ECS挖矿木马病毒处理和解决方案 最近由于网络环境安全意识低的原因,导致一些云服务器ECS中了挖矿病毒的坑. 总结了一些解决挖矿病毒的一些思路.由于病毒更新速度快仅供参考. 1.查看cpu爆满 ...

  2. codeforces 555c// Case of Chocolate// Codeforces Round #310(Div. 1)

    题意:直角边为n的网格巧克力,一格为一块,选择斜边上一点,从左或上吃,直到吃到空气,称为一次操作.给出几个操作,问各能吃几块.如果x是当前要吃的横坐标,在已经吃过的中找x1>=x的第一个x1,即 ...

  3. HDOJ1005

    #include "iostream" using namespace std; int fun(int A,int B,int n) { ,y = ,z; || n == ) ; ...

  4. keras-anomaly-detection 代码分析——本质上就是SAE、LSTM时间序列预测

    keras-anomaly-detection Anomaly detection implemented in Keras The source codes of the recurrent, co ...

  5. 用 Spark 为 Elasticsearch 导入搜索数据

    越来越健忘了,得记录下自己的操作才行! ES和spark版本: spark-1.6.0-bin-hadoop2.6 Elasticsearch for Apache Hadoop 2.1.2 如果是其 ...

  6. react项目打包后路径找不到,项目打开后页面空白的问题

    使用 npm install -g create-react-app快速生成项目脚手架打包后出现资源找不到的路径问题: 解决办法:在package.json设置homepage

  7. WEBSERVICE-CXF服务端代码

    Spring + cxf 发布webservice 依赖的jar包 WEB.xml的配置 applicationContext.xml配置   部署在Tomcat中启动   出现的问题         ...

  8. File storage location distribution in firmware using binwalk

    tool function: Binwalk is a fast, easy to use tool for analyzing, reverse engineering, and extractin ...

  9. 《Python》 while循环、运算符和编码初识

    一.while 循环 while也叫无限循环 while 条件: 循环体 判断条件: 条件为真,进入循环体,循环体执行到底部,返回,继续判断条件. 终止循环: 1.改变条件(标志位的概念) 2.bre ...

  10. <NET CLR via c# 第4版>笔记 第15章 枚举类型和位标志

    15.1 枚举类型 枚举定义的符号是常量值. C#编译器编译时,会用数值替换符号,不再引用定义了符号的枚举类型.可能会出现一些版本问题. Enum.IsDefined(Type enumType, o ...