欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【HDU - 1080】Human Gene Functions(dp,可编辑距离类问题)

发布时间:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【HDU - 1080】Human Gene Functions(dp,可编辑距离类问题) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题干:

给你两个DNA序列(长度不一定相同),你可以在其中任意位置上加入空格,使得最终他俩长度相同,最终相同长度的两个DNA序列会有个相似度比较(每个字符相对应的比较),问你如何放置这些空格使得总相似度最大。

题目告诉你了空格和空格比较的权值是0,这样就保证了答案的有穷性。不然如果是正数的话就可以无穷大了(本也不符合常识)

解题报告:

  类似编辑距离xjb搞就行了。dp[i][j]代表第一个序列前i个和第二个序列前j个完全匹配的最优解。

AC代码:

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define F first #define S second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 400 + 5; const int INF = 0x3f3f3f3f; int sc[MAX][MAX]; int dp[MAX][MAX]; char s1[MAX],s2[MAX]; int Max(int a,int b,int c) {return max(a,max(b,c)); } int main() {sc['A']['A']=5;sc['C']['C']=5;sc['G']['G']=5;sc['T']['T']=5;sc['A']['C']=sc['C']['A']=-1;sc['A']['G']=sc['G']['A']=-2;sc['A']['T']=sc['T']['A']=-1;sc['C']['G']=sc['G']['C']=-3;sc['A'][' ']=sc[' ']['A']=-3;sc['C']['T']=sc['T']['C']=-2;sc['C'][' ']=sc[' ']['C']=-4;sc['G']['T']=sc['T']['G']=-2;sc['G'][' ']=sc[' ']['G']=-2;sc['T'][' ']=sc[' ']['T']=-1;int t;cin>>t;while(t--) {int len1,len2;scanf("%d%s%d%s",&len1,s1+1,&len2,s2+1);for(int i = 0; i<=len1; i++) for(int j = 0; j<=len2; j++) dp[i][j] = -INF; dp[0][0]=0;for(int i = 1; i<=len1; i++) dp[i][0] = dp[i-1][0] + sc[s1[i]][' '];for(int i = 1; i<=len2; i++) dp[0][i] = dp[0][i-1] + sc[s2[i]][' ']; for(int i = 1; i<=len1; i++) {for(int j = 1; j<=len2; j++) {dp[i][j] = Max(dp[i-1][j-1]+sc[s1[i]][s2[j]],dp[i-1][j]+sc[s1[i]][' '],dp[i][j-1]+sc[s2[j]][' ']);}} printf("%d\n",dp[len1][len2]);}return 0 ; }

 

总结

以上是生活随笔为你收集整理的【HDU - 1080】Human Gene Functions(dp,可编辑距离类问题)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。