题意:

输入俩个字符串,怎样变换使其所有字符对和最大。(字符只有'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. JS 封装一个显示时间的函数

    s(); function s (){ var mydate=new Date(); var y = mydate.getFullYear(); var m = mydate.getMonth(); ...

  2. Maven安装+配置

    原先的项目构建属于Ant,就是先export成jar文件,然后引用. Maven依赖一定是引用本地仓库的,所以会先从中央仓库把依赖下载下来存到本地.和NuGet是一样的. 下载 地址 选择一个zip, ...

  3. UVA 12633 Super Rooks on Chessboard (生成函数+FFT)

    题面传送门 题目大意:给你一张网格,上面有很多骑士,每个骑士能横着竖着斜着攻击一条直线上的格子,求没被攻击的格子的数量总和 好神奇的卷积 假设骑士不能斜着攻击 那么答案就是没被攻击的 行数*列数 接下 ...

  4. 关于struts值栈的总结,前端页面如何使用标签取得值栈中的数据

    用户提交一次请求的执行过程 总结: struts值栈中 两个内容 一个是栈 一个是map 值栈(数据中心)的范围是一个请求 它代替了request作用域 struts自定义标签有一个特点 比如遍历集合 ...

  5. 使用githug游戏提高git水平

  6. 工具-VIM常用快捷键

    使用vs code 的插件 amvim来快速编辑代码,要熟记下面的命令 由normal模式切换到insert模式的命令键 i 在光标左侧输入正文 I 在光标所在行的行首输入正文 a 在光标右侧输入正文 ...

  7. codevs——T1576 最长严格上升子序列

    http://codevs.cn/problem/1576/  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  8. 双向链表的实现与操作(C语言实现)

    双向链表也叫双链表,是链表的一种,它的每一个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的随意一个结点開始,都能够非常方便地訪问它的前驱结点和后继结点. 单链表的局限 1.单 ...

  9. lua 中string字符串的使用(string.len, string.char)

    table.keys 返回指定表格中的全部键. 格式: keys = table.keys(表格对象) 使用方法演示样例: local t = {a = 1, b = 2, c = 3} local ...

  10. 通达OA 小飞鱼工作流在线培训教程(一)HTML基础介绍

    应一些刚接触工作流设计朋友的要求,这里开设一个系列教程,对通达OA工作流设计相关的内容做个介绍.方便解决一些日常经常出现的问题,希望对刚刚接触这部分工作的朋友能够有些帮助. 工作流设计须要多方面的知识 ...