hdu 1080 dp(最长公共子序列变形)
题意:
输入俩个字符串,怎样变换使其所有字符对和最大。(字符只有'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(最长公共子序列变形)的更多相关文章
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 53414 Accepted: 18449 Desc ...
- poj 1080 Human Gene Functions (最长公共子序列变形)
题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...
- hdu1503 最长公共子序列变形
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1503 题意:给出两个字符串 要求输出包含两个字符串的所有字母的最短序列.注意输出的顺序不能 ...
- hdu1243(最长公共子序列变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1243 分析:dp[i][j]表示前i个子弹去炸前j个恐怖分子得到的最大分.其实就是最长公共子序列加每个 ...
- HDU 4681 String 最长公共子序列
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意: 给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串.求d最大 ...
- POJ 2250(最长公共子序列 变形)
Description In a few months the European Currency Union will become a reality. However, to join the ...
- hdu1159 dp(最长公共子序列)
题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 56150 Accepted: 19398 Desc ...
- 51Nod 1092 回文字符串 | 最长公共子序列变形
求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #de ...
随机推荐
- vc++如何创建窗口
创建一个mfc工程,AppWizard可以用来增加和选择一些特性 可以发现一共有五个类,每一个类都有一个基类,都是mfc基础类库中的类 例如将一个类拷贝一下,将CFrameWnd到msdn中查找一下, ...
- Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档
0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...
- 处理问题:windows server 2016由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系
windows server可以多用户同时登陆,默认最大远程登录数量为2,如果有更多人需要同时远程登录,则需要安装远程桌面授权服务,第一次安装后,免费期为120天,超过则无法正常远程登录. 解决办法如 ...
- JavaScript CSS 实现简单的 TAB 标签切换
使用CSS隐藏所有tab页,然后使用JavaScript给选中的元素对应ID的tab页设置class="active"类来显示该元素,以此实现tab切换. 如鼠标放置到shwww时 ...
- [LeetCode] 347. 前K个高频元素
python 版方法1:链表 class Solution(object): def topKFrequent(self, nums, k): """ :type num ...
- win7下UDL文件不同
win7 执行UDL文件看不全all驱动.所以没有办法配置数据库的连接.查度娘,方法如下: 在C:\建一个test.udl 文件,运行命令 C:\Windows\syswow64\rundll32.e ...
- 关系数据库标准语言SQL
篇幅过长,恐惧者慎入!!!基础知识,大神请绕道!!! 本节要点: l SQL概述 l 学生-课程关系 l 数据定义 基本表的定义.删除与修改 索引的建立与删除 l 查询 单表查询 连接查询 嵌 ...
- plsql里面执行正常,java运行报ORA-01722: 无效数字
贴代码: <select id="getInfo" parameterClass="java.util.HashMap" resultClass=&quo ...
- nodejs-安装及卸载
linux下安装node 1.编译的方式安装 1 2 3 4 5 6 7 wget http://nodejs.org/dist/node-latest.tar.gz tar zxvf node-l ...
- Linux C++服务器端进程SDK
目标:开发人员在这个SDK的基础上开发,不用关注技术细节,只需要开发对应业务消息处理函数即可 1.每个进程SDK包括一个系统服务和多个业务服务,对外发布服务ID,每个服务有一个请求队列和一个反馈队列, ...