题意:

输入俩个字符串,怎样变换使其所有字符对和最大。(字符只有'A','C','G','T','-')

其中每对字符对应的值如下:

怎样配使和最大呢。

比如:

A G T G A T G 
-  G T T A -  G

和为 (-3)+5+5+(-2)+5+(-1) +5=14.

题解:

最长公共子序列的变形。

设dp[i][j]为a的前i个和b的前j个字符能构成的最大和。

score[][]为每对字符的值,比如score['A']['G']为'A','G'这对字符对应的值。

string a,b为输入的字符串。

状态转移方程:dp[i][j]从下面三种情况中 值最大的 继承

1、如果dp[i][j]=dp[i-1][j]+score[a[i-1]]['-']              //代价是 a的第i-1个字符 和 '-' 配对

2、如果dp[i][j]=dp[i][j-1]+score['-'][b[j-1]]             //代价是 '-' 和 b的第j-1个字符 配对

3、如果dp[i][j]=dp[i-1][j-1]+score[a[i-1]][b[j-1]]     //代价是 a的第i-1个字符 和 b的第j-1个字符 配对

注意:

初始化的时候不只是dp[0][0],还有dp[i][0],dp[0][j]。

AC代码:

#include <iostream>
#include <cstring> using namespace std; const int MAX=200; int dp[MAX][MAX];
int score[MAX][MAX]; string a,b;
int n,m; void init1() //初始化
{
score['A']['A']=5;
score['C']['C']=5;
score['G']['G']=5;
score['T']['T']=5;
score['-']['-']=-10000;
score['A']['C']=score['C']['A']=-1;
score['A']['G']=score['G']['A']=-2;
score['A']['T']=score['T']['A']=-1;
score['A']['-']=score['-']['A']=-3;
score['C']['G']=score['G']['C']=-3;
score['C']['T']=score['T']['C']=-2;
score['C']['-']=score['-']['C']=-4;
score['G']['T']=score['T']['G']=-2;
score['G']['-']=score['-']['G']=-2;
score['T']['-']=score['-']['T']=-1;
} void init2() //dp初始化
{
dp[0][0]=0;
for(int k=1;k<n;k++)
dp[k][0]=dp[k-1][0]+score[a[k-1]]['-']; for(int k=1;k<m;k++)
dp[0][k]=dp[0][k-1]+score['-'][b[k-1]];
}
int mmax(int a,int b,int c) //三个数中取最大值
{
int p=a>b?a:b;
p=p>c?p:c;
return p;
}
int main()
{
int Case;
cin>>Case;
while(Case--)
{
cin>>n>>a;
cin>>m>>b;
int max1,max2,max3;
init1();
init2(); //dp
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
max1=dp[i-1][j-1]+score[a[i-1]][b[j-1]];
max2=dp[i-1][j]+score[a[i-1]]['-'];
max3=dp[i][j-1]+score['-'][b[j-1]];
dp[i][j]=mmax(max1,max2,max3);
}
} cout<<dp[n][m]<<endl;
}
return 0;
}

  

hdu 1080 dp(最长公共子序列变形)的更多相关文章

  1. poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Desc ...

  2. poj 1080 Human Gene Functions (最长公共子序列变形)

    题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...

  3. hdu1503 最长公共子序列变形

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1503 题意:给出两个字符串 要求输出包含两个字符串的所有字母的最短序列.注意输出的顺序不能 ...

  4. hdu1243(最长公共子序列变形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1243 分析:dp[i][j]表示前i个子弹去炸前j个恐怖分子得到的最大分.其实就是最长公共子序列加每个 ...

  5. HDU 4681 String 最长公共子序列

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ...

  6. POJ 2250(最长公共子序列 变形)

    Description In a few months the European Currency Union will become a reality. However, to join the ...

  7. hdu1159 dp(最长公共子序列)

    题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...

  8. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  9. 51Nod 1092 回文字符串 | 最长公共子序列变形

    求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #de ...

随机推荐

  1. 【转】Oracle基础结构认知—初识oracle 礼记八目 2017-12-12 21:19:30

    Oracle服务器(oracle server)由实例和数据库组成.其中,实例就是所谓的关系型数据库管理系统(Relational Database Management System,RDBMS), ...

  2. iOS,android 常用命令

    iOS 常用命令: https://blog.csdn.net/ilikekand17/article/details/81907179 https://www.jianshu.com/p/72c62 ...

  3. 安装sublimeServer插件

    1.安装目的 做练习在谷歌浏览器中遇到报错信息:axios.min.js:8 Failed to load file:///E:/%E8%87%AA%E5%AD%A6/vue%E5%AD%A6%E4% ...

  4. yum 安装nginx(配置开机启动)

    yum install -y nginx 通过yum安装的时候提示下面的错误 [root@localhost yum.repos.d]# yum install nginx 已加载插件:fastest ...

  5. Module.exports 和 exports

    Module.exports 和 exports 在node中,没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部,那么模块间如何通信 当加载一个模块的时候,被加载模块的代码在第一次 ...

  6. N3-1 - 数组 - convert-sorted-array-to-binary-search-tree

    题目描述: Given an array where elements are sorted in ascending order, convert it to a height balanced B ...

  7. UVA455 - Periodic Strings(紫书习题3.4)

    如果一个字符串可以被某个长度为k的字符串重复多次得到,则称这个字符串的周期为k.例如,字符串"abcabcabcabc"以3为周期(当然,他也以6.12等等为周期).  现在请你编 ...

  8. Ural 1996 Cipher Message 3 (生成函数+FFT)

    题面传送门 题目大意:给你两个$01$串$a$和$b$,每$8$个字符为$1$组,每组的最后一个字符可以在$01$之间转换,求$b$成为$a$的一个子串所需的最少转换次数,以及此时是从哪开始匹配的. ...

  9. 找不到javax.servlet.http.HttpServletResponse和javax.servlet.http.HttpServletRequest

    导了个项目进eclipse,发现很多文件都报了错,错误提示是没有引入javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServl ...

  10. USB OTG学习笔记

    仅仅看了半天SPEC写的笔记,有些乱,等调试完毕再次整理,思路不是很成熟,推测成分较多,可能有不对的地方,欢迎拍砖交流指正.   1. 概要     OTG设备使用插头中的ID引脚来区分A/B Dev ...