POJ1080
一道字符串DP,然而不需要状压之类的玄学操作
题目大意:给你两个串,由'A','C','G','T'组成,现在你可以在这两个串中的某些位置插入'-',最终要使得它们的长度相等
给出两个字符匹配时的匹配度表格(题面中给出),让你求如何添加'-'使得总匹配度最大
很简单的DP,我们用f[i][j]表示使用了第一个串中前i个字符,第二个串中前j个字符(注意一定是使用了,即人为填上去的'-'不算)
然后对于每一个位置都有三种选择:
让两个串相应位置上的字符直接匹配,即f[i][j]=max(f[i][j],f[i-1][j-1]+g[s1[i]][s2[j]]
在第一个串中填入一个'-',即f[i][j]=max(f[i][j],f[i][j-1]+g['-'][s2[j]]
在第二个串中填入一个'-',即f[i][j]=max(f[i][j],f[i-1][j]+g[s1[i]]['-']
最后的ans就是f[len1][len2]
CODE
#include<cstdio>
#include<cstring>
using namespace std;
const int N=105,g[5][5]=
{
{5,-1,-2,-1,-3},
{-1,5,-3,-2,-4},
{-2,-3,5,-2,-2},
{-1,-2,-2,5,-1},
{-3,-4,-2,-1,0},
};
int f[N<<1][N<<1],t,len1,len2;
char s1[N],s2[N];
inline int get(char ch)
{
if (ch=='A') return 0;
if (ch=='C') return 1;
if (ch=='G') return 2;
if (ch=='T') return 3;
if (ch=='-') return 4;
}
inline int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
register int i,j; scanf("%d",&t);
while (t--)
{
scanf("%d",&len1); scanf("%s",s1+1);
scanf("%d",&len2); scanf("%s",s2+1);
memset(f,167,sizeof(f)); f[0][0]=0;
for (i=1;i<=len1;++i)
f[i][0]=f[i-1][0]+g[get(s1[i])][get('-')];
for (i=1;i<=len2;++i)
f[0][i]=f[0][i-1]+g[get('-')][get(s2[i])];
for (i=1;i<=len1;++i)
for (j=1;j<=len2;++j)
{
f[i][j]=max(f[i][j],f[i-1][j]+g[get(s1[i])][get('-')]);
f[i][j]=max(f[i][j],f[i][j-1]+g[get('-')][get(s2[j])]);
f[i][j]=max(f[i][j],f[i-1][j-1]+g[get(s1[i])][get(s2[j])]);
}
printf("%d\n",f[len1][len2]);
}
return 0;
}
其实这个很显然也可以滚存,但我实在懒得写了
POJ1080的更多相关文章
- 【poj1080】 Human Gene Functions
http://poj.org/problem?id=1080 (题目链接) 题意 给出两个只包含字母ACGT的字符串s1.s2,可以在两个字符串中插入字符“-”,使得s1与s2的相似度最大. Solu ...
- LCS poj1080
题目链接:https://vjudge.net/problem/POJ-1080 参考博客:https://yq.aliyun.com/ziliao/372259 题意:给两个字符串,只含有'A',' ...
- POJ-1080 Human Gene Functions---类似LCS
题目链接: https://cn.vjudge.net/problem/POJ-1080 题目大意: 给定两组序列,要你求出它们的最大相似度,每个字母与其他字母或自身和空格对应都有一个打分,求在这两个 ...
- poj1080 dp
//Accepted 200 KB 0 ms //dp //dp[i][j]表示s1用前i个,s2用前j个字符能得到的最大分数 //dp[i][j]=max(dp[i-1][j]+score[s1[i ...
- POJ1080 Human Gene Functions(LCS)
题目链接. 分析: 和 LCS 差不多. #include <iostream> #include <cstdio> #include <cstdlib> #inc ...
- POJ1080 Human Gene Functions 动态规划 LCS的变形
题意读了半年,唉,给你两串字符,然后长度不同,你能够用'-'把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分 跟LCS非常像的DP数组 dp[i][j]表示第一个字符串取第i个 ...
- POJ1080(LCS变形)
Human Gene Functions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- poj1080 - Human Gene Functions (dp)
题面 It is well known that a human gene can be considered as a sequence, consisting of four nucleotide ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
随机推荐
- JAVA EE期末项目-校园小商店
校园小商店 一.项目成员及分工 我(计科二班袁文雪)和队友(计科二班蒋媛)设计了一款面对校园的网上购物商店. 我的工作:理解分析代码,编写文档. 二.项目需求分析 网上商店系统主要是实现学生网上选商品 ...
- LeetCode题解之Longest Palindromic Substring
1.题目描述 2.问题分析 计算每个字符所组成的字符串的回文子串. 3.代码 string longestPalindrome(string s) { ; ; bool is_odd = false ...
- LeetCode题解之Rotate String
1.题目描述 2.问题分析 直接旋转字符串A,然后做比较即可. 3.代码 bool rotateString(string A, string B) { if( A.size() != B.size( ...
- Unix操作系统监控详解(一)
一.描述 监控在检查系统问题运行状况以及优化系统性能工作上是一个不可缺少的部分.通过操作系统监控工具监视操作系统资源的使用情况,间接地反映了各服务器程序的运行情况.根据运行结果分析可以帮助我们快速定位 ...
- sshpass 绕过ssh 密码交互式验证
经常我们使用脚本登入服务器的时候,如果使用ssh 命令,经常会提示密码输入,我们不得不手动输入密码,因为ssh 没有 密码的选项. 为了能绕过交互式验证,我们使用sshpass命令解决这个问题: 1. ...
- 【转】Java学习—什么是时间复杂度
[原文]https://www.toutiao.com/i6593144782992704007/ 转载:程序员小灰 时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景: 某一天,小灰和大 ...
- 【转】Java学习---解析Java Servlet工作过程
[原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...
- DevExpress08、SchedulerControl、DateNavigator、SpreadsheetControl
SchedulerControl 该控件以可视化的效果显示预约或者设定的行程: 该控件预约后的数据存储在SchedulerStorage对象里, 当以拖动形式添加SchedulerControl控件到 ...
- 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,
未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft ...
- 【Ansible 文档】【译文】配置文件
这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...