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 ...
随机推荐
- pip是用代理
内网访问外网时,需要通过vpn访问,但是pip貌似不能是用vpn访问外网.直接度娘: windows下: set http_proxy=http://代理服务器:端口 不行可以试试下面的: set h ...
- webpack学习笔记(4)--webpack.config.js
devtool参数 这个参数控制是否生成,以及如何生成source map,已经在官网的doc说明总结了. 下表总结了各个参数和使用的情况 devtool 构建速度 重新构建速度 生产环境 品质(qu ...
- Project Euler 42 Coded triangle numbers
题意:三角形数序列的第n项由公式tn = 1/2n(n+1)给出:因此前十个三角形数是: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, - 将一个单词的每个字母分别转化为其 ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
- 2016年工作中遇到的问题1-10:select-for-update锁表
1.select... for update锁表.注意事项:事务下使用,@Transactional如果用主键,只锁住1行记录如果不用主键,会锁住多条记录,mysql下测试,查询1条,锁住1行,查询2 ...
- 【codeforces 724E】Goods transportation
[题目链接]:http://codeforces.com/problemset/problem/724/E [题意] 有n个城市; 这个些城市每个城市有pi单位的物品; 然后已知每个城市能卖掉si单位 ...
- Qt QImage与OpenCV Mat转换
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51029382 应一个朋友的要求,整理总 ...
- BA-siemens-PXC模块调试
PXC24模块写地址步骤: 1.制作一根HMI线: 2.通过HMI+232转USB转接卡连接模块: 3.根据已经做好的系统架构表来配置模块: 写模块之前不要忘了格式化模块,主要命令如下: 视频教程:h ...
- JeeSite(2):导入数据,进入系统
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50954485 未经博主同意不得转载. 博主地址是:http://blog.csd ...
- MMORPG大型游戏设计与开发(server 游戏场景 事件)
游戏截图 场景事件 一个完整的对象一般都拥有事件,至于什么是事件在这里就不多解释了. 在场景中的事件在天龙/武侠世界中的事件包含场景初始化.场景定时器.场景退出.玩家进入场景.角色升级.角色死亡.角色 ...