题意读了半年,唉,给你两串字符,然后长度不同,你能够用‘-’把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分

跟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的变形的更多相关文章

  1. poj 1080 Human Gene Functions(lcs,较难)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19573   Accepted:  ...

  2. poj1080 - Human Gene Functions (dp)

    题面 It is well known that a human gene can be considered as a sequence, consisting of four nucleotide ...

  3. POJ 1080 Human Gene Functions -- 动态规划(最长公共子序列)

    题目地址:http://poj.org/problem?id=1080 Description It is well known that a human gene can be considered ...

  4. POJ1080 Human Gene Functions(LCS)

    题目链接. 分析: 和 LCS 差不多. #include <iostream> #include <cstdio> #include <cstdlib> #inc ...

  5. POJ-1080 Human Gene Functions---类似LCS

    题目链接: https://cn.vjudge.net/problem/POJ-1080 题目大意: 给定两组序列,要你求出它们的最大相似度,每个字母与其他字母或自身和空格对应都有一个打分,求在这两个 ...

  6. poj1080--Human Gene Functions(dp:LCS变形)

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17206   Accepted:  ...

  7. POJ 1080:Human Gene Functions LCS经典DP

    Human Gene Functions Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18007   Accepted:  ...

  8. 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 ...

  9. Human Gene Functions

    Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18053 Accepted: 1004 ...

随机推荐

  1. vim使用(三):.viminfo和.vimrc

    1. viminfo 在vim中操作的行为,vim会自己主动记录下来,保存在 ~/.viminfo 文件里. 这样为了方便下次处理, 如:vim打开文件时,光标会自己主动在上次离开的位置显示. 原来搜 ...

  2. jquery的attr禁用表单元素的方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll的解决方法

    VS2010不能编译SQLServer2005的Microsoft.SQLServer.ManagedDTS.dll是最近碰到的一个疑难杂症问题,通过查询微软社区和一些英文资料找到了解决方法,同事说之 ...

  4. Scripting Java #3:Groovy与invokedynamic

    只需看看今天Groovy语言实现机制.在此之前,是第一个推倒静态类型与动态类型语言在实现上面的一些差异. 静态类型 vs. 动态类型 看以下这个简单的栗子. def addtwo(a, b) { re ...

  5. [转载] 树莓派读取温湿度传感器DHT11

    原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块  接树莓派5V GND GPIO1 功 ...

  6. hive的非交互模式

    在linux的终端运行:$HIVE_HOME/bin/hive 会进入交互模式: $HIVE_HOME/bin/hive  -e或者-f 是非交互模式 1.非交互模式运行HQL语句 $HIVE_HOM ...

  7. Linux/UNIX流程关系

    流程关系 过程组 除了一个过程,每个过程ID此外.也属于一个进程组.过程基是一个或多个过程的集合. 通常它们与相同的作业相关联,它接受各种信号从相同终端. #include<unistd.h&g ...

  8. WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

    原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  9. Linux 环境下 Lua 安装(转)

    系统环境:CentOS-6.2-x86_64. Lua 是嵌入式脚本语言,应用场景很广泛. 引自官网:Lua is used in many products and projects around ...

  10. 懒与馋的平衡:餐饮O2O市场广阔,发展不易

    餐饮行业是众多行业中O2O起步较早的,现在方兴未艾的团购站点中最先涉足的领域就有餐饮版块.长时间的合作推广,很多餐饮商家已经从中尝到甜头,可以说餐饮行业市场基础培育的比較好,所以餐饮O2O 已经是大势 ...