题目转自hdu 1080,题目传送门


题目大意:

不想翻译!


解题思路:

其实就是一道变异的求lcs(Longest common subsequence 最长公共子序列)的题

不过,它的依据是下面这张图:

所以,需要一个数组来存规则:

int ta[][]={
{,-,-,-,-},
{-,,-,-,-},
{-,-,,-,-},
{-,-,-,,-},
{-,-,-,-,}
};

同时,需要把每个字母对应成一个数字

处理字母对应代码如下:

int get_init(char s)
{
if(s=='A') return ;
else if(s=='C') return ;
else if(s=='G') return ;
else if(s=='T') return ;
else return ;
}

但有是由于它的计分标准要按照那个表计算

所以我们要通过函数来计算所对应的分值:

int get_value(char s1,char s2)
{
int x=get_init(s1);
int y=get_init(s2);
return ta[x][y];
}

但是,令人头秃的是如何初始化......

于是,思考了0.5h后,我放弃了

后来,我去问了lhc学长(学长博客点此,被迫推荐)

然后这位大佬看了题,没过10min就读懂了

1min后,初始化代码就被他写出来了,如下:

for(int i=;i<=l1;i++) dp[i][]=dp[i-][]+get_value(s1[i],'-');
for(int i=;i<=l2;i++) dp[][i]=dp[][i-]+get_value('-',s2[i]);

p.s.这代码我可看了0.25h才看懂,大佬真的很nb

然后随便写一个n2的dp就可以愉快地AC了......(愉快吗?)


AC代码如下:

#include<iostream>
#include<stdio.h>
#include<string.h>
#define maxn 105
using namespace std;
char s;
char s1[maxn],s2[maxn];
int T,l1,l2;
int dp[maxn][maxn];
int ta[][]={
{,-,-,-,-},
{-,,-,-,-},
{-,-,,-,-},
{-,-,-,,-},
{-,-,-,-,}
};
int get_init(char s)
{
if(s=='A') return ;
else if(s=='C') return ;
else if(s=='G') return ;
else if(s=='T') return ;
else return ;
}
int get_value(char s1,char s2)
{
int x=get_init(s1);
int y=get_init(s2);
return ta[x][y];
}
void dp_lcs(int l1,int l2)
{
for(int i=;i<=l1;i++)
for(int j=;j<=l2;j++)
dp[i][j]=max(dp[i-][j-]+get_value(s1[i],s2[j]),max(dp[i-][j]+get_value(s1[i],'-'),dp[i][j-]+get_value('-',s2[j])));
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(dp,,sizeof(dp));
scanf("%d%s",&l1,s1+);
scanf("%d%s",&l2,s2+);
dp[][]=;
for(int i=;i<=l1;i++) dp[i][]=dp[i-][]+get_value(s1[i],'-');
for(int i=;i<=l2;i++) dp[][i]=dp[][i-]+get_value('-',s2[i]);
dp_lcs(l1,l2);
printf("%d\n",dp[l1][l2]);
}
return ;
}

码风清奇,不喜勿喷

从这道题我们可以看出,有几个大佬当朋友还是有用的......

DP问题(3) : hdu 1080的更多相关文章

  1. HDU 1080 DP

    匹配两个人相似度. A,G,C.T.每两个都会有一个相应的值,给出两串基因.长度能够不一样,能够在基因中间加_使两串长度一样.然后有一个相应值.求最大相应值. 先做出相应的表 DP方程: x=dp[i ...

  2. hdu 1080 dp(最长公共子序列变形)

    题意: 输入俩个字符串,怎样变换使其所有字符对和最大.(字符只有'A','C','G','T','-') 其中每对字符对应的值如下: 怎样配使和最大呢. 比如: A G T G A T G -  G ...

  3. hdu 1080 Human Gene Functions(DP)

    题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...

  4. HDU 1080

    http://acm.hdu.edu.cn/showproblem.php?pid=1080 二维最长公共子序列 #include <iostream> #include <cstd ...

  5. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  6. DP问题(2) : hdu 1421

    题目转自hdu 1421,题目传送门 题目大意: 给你n个物品,你要搬走2*k个(也就是搬k次) 每次搬需要花费v,v=(ai-aj)2 (i表示左手拿的物品重量,j表示右手拿的物品的重量) 要求所有 ...

  7. DP问题(1) : hdu 2577

    题目转自hdu 2577,题目传送门 题目大意: 现给你n个区分大小写的字符串,大小写可用Caps Lock和shift切换(学过计算机的都知道) 但是有一点需要注意(shift是切换,若现在是大写锁 ...

  8. dp or 贪心 --- hdu : Road Trip

    Road Trip Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 29 ...

  9. HDU 1080 Human Gene Functions

    最长公共子序列的变形 题目大意:给出两个基因序列,求这两个序列的最大相似度. 题目中的表格给出了两两脱氧核苷酸的相似度. 状态转移方程为: dp[i][j] = max(dp[i-1][j]+Simi ...

随机推荐

  1. mybatis报错:Invalid bound statement (not found)

    mybatis报错:Invalid bound statement (not found)的原因很多,但是正如报错提示一样,找不到xml中的sql语句,报错的情况分为三种: 第一种:语法错误 Java ...

  2. java优化细节记录

    此处是为了记录一些优化细节,从网上收集而来,仅供后续代码开发参考使用,如发现更好的,会不断完善 首先确认代码优化的目标是: 减小代码的体积 提高代码运行的效率 代码优化细节 1.尽量指定类.方法的fi ...

  3. 解决centos ssh连接很慢的问题

    更改配置文件vi /etc/ssh/sshd_config找到UseDNS 将UseDNS前面的#删除,并将YES改为NO,若找不到UseDNS,则手动添加UseDNS,并将其设置成No保存并重启ss ...

  4. mysql建表中auto_increment=21

    CREATE TABLE `demo` ( `id` ) NOT NULL AUTO_INCREMENT, `img` ) DEFAULT NULL COMMENT '大图', `status` ) ...

  5. UWP使用Microsoft.Data.Sqlite的记录

    我在UWP中使用SQLite数据库时,并没有使用网上的SQLite for Universal App Platform方案,而使用了Microsoft和SQLite社区一起维护的Microsoft. ...

  6. eclipse启动tomcat警告 [SetPropertiesRule]{Server/Service/Engine/Host/Context}

    解决问题:解决办法是:关闭tomcat,双击eclipse下tomcat服务器,在出来的Tomcat server at localhost页面中找到server options选项,选中其中的选项” ...

  7. Java开发在线考试系统 使用ssh框架编写源码

    开发工具: Eclipse,  Tomcat,  MySql       1.  登录页面登录功能, 输入用户名与密码, 选择角色, 滑动箭头拉到最右边才可以点击登录       2.  学生角色登录 ...

  8. 前端开发JS——数组

    25.数组 1)声明数组: ①构造函数创建数组 var arr = new Array(); console.log(arr):        //[]   var arr = new Array(2 ...

  9. win7 安装vb6

    1. 用setup.exe有问题,用acmsetup.exe 2.打开setupwiz.ini,把"acme=acmboot.exe"改为"=setup\acmsetup ...

  10. 简单使用:SpringBoot使用freemarker

    使用步骤: a : 添加依赖 b: 创建模板文件 保存位置resources/templates 目录下 文件后缀名.ftl c 编写controller 把结果传递给模板 在resources.te ...