您的位置:首页 > 其它

SDUT_线性dp联系结题报告:

2011-11-29 13:50 344 查看
1001:求最大子段和,关键是判断当前位置选与不选的状态状态转移方程:dp[i]=max(dp[i-1]+a[i],a[i]);还要记录起点与终点(单独开了一个结构体记录到达每个点的起点与终点)

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

View Code

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[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 a[107],b[107];
char s1[107],s2[107];
int f[107][107];
int Max(int x,int y,int z)
{
int tmp=-99999999;
if(tmp<x) tmp=x;
if(tmp<y) tmp=y;
if(tmp<z) tmp=z;
return tmp;
}
int main()
{
int t,n,m,i,j;
scanf("%d",&t);
while(t--)
{
cin>>n>>s1;
cin>>m>>s2;
for(i=0;i<n;i++)
{
if(s1[i]=='A') a[i+1]=0;
else if(s1[i]=='C') a[i+1]=1;
else if(s1[i]=='G') a[i+1]=2;
else if(s1[i]=='T')a[i+1]=3;
}
for(i=0;i<m;i++)
{
if(s2[i]=='A') b[i+1]=0;
else if(s2[i]=='C') b[i+1]=1;
else if(s2[i]=='G') b[i+1]=2;
else if(s2[i]=='T')b[i+1]=3;
}
f[0][0]=0;
for(i=1;i<=n;i++) f[i][0]=f[i-1][0]+map[a[i]][4];
for(j=1;j<=m;j++) f[0][j]=f[0][j-1]+map[4][b[j]];
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
int f1=f[i-1][j-1]+map[a[i]][b[j]];
int f2=f[i-1][j]+map[a[i]][4];
int f3=f[i][j-1]+map[4][b[j]];
f[i][j]=Max(f1,f2,f3);
}
}
cout<<f
[m]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: