您的位置:首页 > 其它

hdu 1080 Human Gene Functions

2011-11-28 21:00 483 查看
二维DP

先把四种字符映射成整数 空格为 4 然后将对应的相似程度值存入

sim 数组中以便查找

ans[i][j] 表示 a 中第 i 个与 b 中第 j 个为最后时的最大相似程度值

其中包括 a[i] 与 b[j]成对 a[i]与 空格成对 空格与b[j]成对三种情况

要取最大的一种情况

以 0 0 为截止点

http://acm.hdu.edu.cn/showproblem.php?pid=1080

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>

using namespace std;

int sim[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 ans[101][101];
char s[102];
int a[102];
int b[102];
int dp(int i,int j)
{
if(ans[i][j]!=-1)//已计算出
return ans[i][j];
if(!i&&!j)//截止情况
{
ans[i][j]=0;
return ans[i][j];
}
if(!i)
{
ans[i][j]=dp(i,j-1)+sim[4][b[j]];
return ans[i][j];
}
if(!j)
{
ans[i][j]=dp(i-1,j)+sim[a[i]][4];
return ans[i][j];
}
if(i>0&&j>0)//重点在这里哟 亲
{
ans[i][j]=max(sim[a[i]][b[j]]+dp(i-1,j-1),max(sim[a[i]][4]+dp(i-1,j),sim[4][b[j]]+dp(i,j-1)));
return ans[i][j];
}

}
int main()
{

//freopen("D:\\6\\bin\\Debug\\hu.txt","r",stdin );

int T,n,m,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%s",s);
for(i=0;i<n;i++)
if(s[i]=='A')
{
a[i+1]=0;
}else if(s[i]=='C')
{
a[i+1]=1;
}else if(s[i]=='G')
{
a[i+1]=2;
}else
{
a[i+1]=3;
}
scanf("%d",&m);
scanf("%s",s);
for(i=0;i<m;i++)
if(s[i]=='A')
{
b[i+1]=0;
}else if(s[i]=='C')
{
b[i+1]=1;
}else if(s[i]=='G')
{
b[i+1]=2;
}else
{
b[i+1]=3;
}
memset(ans,-1,sizeof(ans));
printf("%d\n",dp(n,m));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: