您的位置:首页 > 其它

poj 1080 Human Gene Functions dp

2013-04-14 19:39 309 查看
这个题目也没什么可以说的了
dp[i][j]表示第一段长度为i,第二段长度为j的时候的最优值
状态转移方程
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+mat[a[i]][b[j]]);

dp[i][j]=max(dp[i][j],dp[i-1][j]+mat[a[i]][0]);

dp[i][j]=max(dp[i][j],dp[i][j-1]+mat[0][b[j];

注意边界就ok了

#include
#include
#include
using namespace std;
const int maxn=111,inf=99999999;
char a[maxn],b[maxn];
int mat[501][501];
int dp[maxn][maxn];
const char A='A',G='G',T='T',C='C';

int max(int a,int b)
{
if(a>b)
return(a);
return(b);
}

int main()
{
int tcase;

scanf("%d",&tcase);

mat[A][A]=mat[C][C]=mat[T][T]=mat[G][G]=5;

mat[A][C]=mat[C][A]=-1;

mat[A][T]=mat[T][A]=-1;

mat[A][G]=mat[G][A]=-2;

mat[A][0]=mat[0][A]=-3;

mat[C][G]=mat[G][C]=-3;

mat[C][T]=mat[T][C]=-2;

mat[C][0]=mat[0][C]=-4;

mat[G][T]=mat[T][G]=-2;

mat[G][0]=mat[0][G]=-2;

mat[T][0]=mat[0][T]=-1;

while(tcase--)
{

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

int n,m;

scanf("%d %s %d
%s",&n,&a[1],&m,&b[1]);

dp[0][0]=0;

for(int i=1;i<=n;i++)

dp[i][0]=mat[a[i]][0]+dp[i-1][0];

for(int i=1;i<=m;i++)

dp[0][i]=mat[b[i]][0]+dp[0][i-1];

dp[1][1]=mat[a[1]][b[1]];

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

{

dp[i][j]=-inf;

dp[i][j]=max(dp[i][j],dp[i-1][j-1]+mat[a[i]][b[j]]);

dp[i][j]=max(dp[i][j],dp[i-1][j]+mat[a[i]][0]);

dp[i][j]=max(dp[i][j],dp[i][j-1]+mat[0][b[j]]);

}

printf("%d\n",dp
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: