POJ1080 Human Gene Functions 动态规划 LCS的变形
题意读了半年,唉,给你两串字符,然后长度不同,你能够用‘-’把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分
跟LCS非常像的DP数组 dp[i][j]表示第一个字符串取第i个元素第二个字符串取第三个元素,然后再预处理一个得分表加上就可以
得分表:
score['A']['A'] = score['C']['C'] = score['G']['G'] = score['T']['T'] = 5; 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; score['-']['-'] = -inf;
那么DP方程就好推了:
dp[i][j] = :
dp[i-1][j] + score[s1[i-1]]['-']或者
dp[i][j-1] + score['-'][s2[j-1]]或者
dp[i-1][j-1] + score[s1[i-1]][s2[j-1]]或者
这三者之中取最大的
然后就是边界问题我给忘记了
不够细心,若单单是i==0或者j==0,边界问题就出现了,边界不可能为0的,所以还得处理一下边界
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype> #define ll long long #define LL __int64 #define eps 1e-8 #define inf 0xfffffff //const LL INF = 1LL<<61; using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p; const int N = 1000 + 5; int dp[N][N];
int score[200][200]; void init() {
score['A']['A'] = score['C']['C'] = score['G']['G'] = score['T']['T'] = 5; 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; score['-']['-'] = -inf;
} int main () {
init();
int t;
char s1[N];
char s2[N];
scanf("%d",&t);
while(t--) {
int n,m;
memset(dp,0,sizeof(dp));
scanf("%d %s",&n,s1);
scanf("%d %s",&m,s2);
for(int i=1;i<=n;i++)
dp[i][0] = dp[i-1][0] + score[s1[i-1]]['-'];//边界处理
for(int j=1;j<=m;j++)
dp[0][j] = dp[0][j-1] + score['-'][s2[j-1]];//边界处理
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
int t1 = dp[i-1][j] + score[s1[i-1]]['-'];
int t2 = dp[i][j-1] + score['-'][s2[j-1]];
int t3 = dp[i-1][j-1] + score[s1[i-1]][s2[j-1]];
int maxn = max(t1,t2);
dp[i][j] = max(maxn,t3);
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
POJ1080 Human Gene Functions 动态规划 LCS的变形的更多相关文章
- poj 1080 Human Gene Functions(lcs,较难)
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19573 Accepted: ...
- poj1080 - Human Gene Functions (dp)
题面 It is well known that a human gene can be considered as a sequence, consisting of four nucleotide ...
- POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)
题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...
- POJ1080 Human Gene Functions(LCS)
题目链接. 分析: 和 LCS 差不多. #include <iostream> #include <cstdio> #include <cstdlib> #inc ...
- POJ-1080 Human Gene Functions---类似LCS
题目链接: https://cn.vjudge.net/problem/POJ-1080 题目大意: 给定两组序列,要你求出它们的最大相似度,每个字母与其他字母或自身和空格对应都有一个打分,求在这两个 ...
- poj1080--Human Gene Functions(dp:LCS变形)
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17206 Accepted: ...
- POJ 1080:Human Gene Functions LCS经典DP
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18007 Accepted: ...
- hdu1080 Human Gene Functions() 2016-05-24 14:43 65人阅读 评论(0) 收藏
Human Gene Functions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Human Gene Functions
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...
随机推荐
- Windows Phone开发(14):数据模板
原文:Windows Phone开发(14):数据模板 数据模板,如果你仅仅听到这个名词,你一定很迷惑,什么来的?用来干什么的?不急,亲,今天,我们一起来探索一下吧. 用白话文说,数据模板就是用来规范 ...
- 动画(Animation) 它 (闪烁、左右摇摆、跷跷板等功效)
一侧到另一侧的影响: (这里显示的是并不那么顺利) 一.续播 (不知道取什么名字好,就是先播放动画A, 接着播放动画B) 有两种方式. 第一种.分别动画两个动画,A和B, 然后先播放动画A,设置A ...
- swift笔记 (三) —— 字符和字符串
字符串和字符 苹果要是不提供了unicode的字符串和字符,那就是他们公司全部人的脑袋都被门夹过 他自己家都要发非常多国家的版本号的软件,怎么可能不用unicode呢 此处略去30字... 这里能够拿 ...
- Swift基础--使用TableViewController自己定义列表
首先建立一个swift项目,把storyboard的内容删掉,加入一个Navigation Controller.然后设置storyboard相应界面的class,在Navigation Contro ...
- android实现应用程序仅仅有在第一次启动时显示引导界面
概述 SharedPreferences的使用很easy,可以轻松的存放数据和读取数据.SharedPreferences仅仅能保存简单类型的数据,比如,String.int等.通常会将复杂类型的数据 ...
- [转载] RaspberryPi B+ WiringPi 引脚对应图
Pin Numbering - Raspberry Pi Model B+ Numbering Scheme Expansion Header J8 Pinout (40-pin Header) Ad ...
- HDU 1557 权利指数 国家压缩 暴力
HDU 1557 权利指数 状态压缩 暴力 ACM 题目地址:HDU 1557 权利指数 题意: 中文题,不解释. 分析: 枚举全部集合,计算集合中的和,推断集合里面的团体是否为关键团队. 代码: ...
- 【Linux探索之旅】第一部分测试题
内容简介 1.第一部分测试题 2.第二部分第一课预告:终端Terminal,好戏上场 10道测试题 让我们选择开机时进哪个操作系统的软件叫什么? A. booter B. bootloader C. ...
- iOS_数据库3_sqlite3基本操作
终于效果图: Sqlite3函数总结 1.打开数据库 int sqlite3_open( const char *filename, // 数据库的文件路径 sqlite3 **ppDb // 数据 ...
- 网络基础知识系列:阐述VLAN和Trunk
网络性能是影响的效率的重要因素. 大的广播域分割方法,旨在提高网络性能.一个接口上,可是,路由器的LAN接口数量有限,它的主要功能是在网络间数据传输,而不是对终端设备提供网络接入. 訪问LAN的功能还 ...