POJ 1080(最长公共子序列)
来源:互联网 发布:淘宝类似图片怎么搜索 编辑:程序博客网 时间:2024/05/22 08:04
题目链接:http://poj.org/problem?id=1080
一道最长公共子序列变形的题目。
关于那个表格,没想到很好的处理方式,直接打表了。
最长公共子序列的状态转移方程:
if(a[i]==b[i]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
这道题需要做一下变形:
s1取字母,s2取字母:dp[i-1][j-1]+f[s1[i]][s2[j]]
s1取'-',s2取字母:dp[i][j-1]+f['-'][s2[j]]
s1取字母,s2取'-':dp[i-1][j]+f[s1[i]]['-']
dp[i][j]等于三者的最大值。
在求解之前,需要初始化:
dp[0][0]=0;
dp[i][0]=dp[i-1][0]+f[s1[i]]['-'];
dp[0][j]=dp[0][j-1]+f['-'][s2[j]];
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=105;int T,n,m;char s1[maxn],s2[maxn];int dp[maxn][maxn],f[maxn][maxn];void work(){f['A']['A']=5;f['C']['A']=-1;f['G']['A']=-2;f['T']['A']=-1;f['-']['A']=-3;f['A']['C']=-1;f['C']['C']=5;f['G']['C']=-3;f['T']['C']=-2;f['-']['C']=-4;f['A']['G']=-2;f['C']['G']=-3;f['G']['G']=5;f['T']['G']=-2;f['-']['G']=-2;f['A']['T']=-1;f['C']['T']=-2;f['G']['T']=-2;f['T']['T']=5;f['-']['T']=-1;f['A']['-']=-3;f['C']['-']=-4;f['G']['-']=-2;f['T']['-']=-1;f['-']['-']=INF;}void initData(){dp[0][0]=0;for(int i=1;i<=n;i++)dp[i][0]=dp[i-1][0]+f[s1[i]]['-'];for(int j=1;j<=m;j++)dp[0][j]=dp[0][j-1]+f['-'][s2[j]];}int main(){#ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout);#endif work(); scanf("%d",&T); while(T--){ scanf("%d%s%d%s",&n,s1+1,&m,s2+1); initData(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ int tmp1=dp[i-1][j-1]+f[s1[i]][s2[j]]; int tmp2=dp[i-1][j]+f[s1[i]]['-']; int tmp3=dp[i][j-1]+f['-'][s2[j]]; dp[i][j]=max(max(tmp1,tmp2),tmp3); } } printf("%d\n",dp[n][m]); }return 0;}
0 0
- POJ 1080(最长公共子序列)
- POJ 1458(最长公共子序列)
- POJ 3356 (最长公共子序列)
- POJ 2250Compromise(DP最长子公共子序列)
- poj 1080 zoj 1027(最长公共子序列变种)
- poj 1458最长公共子序列(LCS)
- poj 2250 Compromise(LCS,最长公共子序列)
- 【mark】最长公共子序列(poj 1458+hdu 1159)
- poj 2127(最长公共上升子序列)
- POJ 3356 AGTC(最长公共子序列)
- POJ 3356 AGTC(最长公共子序列)
- POJ 1458 Common Subsequence(最长公共子序列问题)
- POJ 2250 Compromise(最长公共子序列)
- poj 2127 dp(最长公共递增子序列)
- 最长公共子序列 LCS(模板) poj 1458
- POJ 1458 Common Subsequence(最长公共子序列)
- POJ 1159 Palindrome(最长公共子序列)
- 【poj 1692】Crossed Matchings (最长公共子序列变形)
- win7 .net加解密模块出错,System.Reflection.TargetInvocationException
- hibernate之hibernate.cfg.xml详解
- 第一行代码2.5-活动的启动模式
- svn分支开发与主干合并(branch & merge)
- 关于SpringAOP的一些事
- POJ 1080(最长公共子序列)
- hive 安装和配置 详细教程
- chown, chmod
- hibernate开发环境搭建
- systemtap dump kernel function call stack and print function parameters
- uva1382- Distant Galaxy (枚举)
- Binder service入门—框架层、应用层调用native binder service
- 一、前言
- iOS应用性能调优的25个建议和技巧