ZOJ1027 Human Gene Functions

 #include<iostream>

using namespace std;
#include<string>

int num,length1,length2;
string s1,s2;
int f[105][105]; //f[i][j]表示a的前i个字符与b的前j个字符的最大权值
int a[105];
int b[105];

int main()
{
int judge[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 i,j;

cin>>num;
while(num--)
{
cin>>length1>>s1>>length2>>s2;

for(i=0;i<length1;i++)
{
if(s1[i]=='A') a[i]=0;
else if(s1[i]=='C') a[i]=1;
else if(s1[i]=='G') a[i]=2;
else if(s1[i]=='T') a[i]=3;
else return 1;
}

for(i=0;i<length2;i++)
{
if(s2[i]=='A') b[i]=0;
else if(s2[i]=='C') b[i]=1;
else if(s2[i]=='G') b[i]=2;
else if(s2[i]=='T') b[i]=3;
else return 1;
}

f[0][0]=0;
for(i=1;i<=length1;i++)
{
f[i][0]=f[i-1][0]+judge[a[i-1]][4];
}
for(j=1;j<=length2;j++)
{
f[0][j]=f[0][j-1]+judge[4][b[j-1]];
}

for(i=1;i<=length1;i++)
{
for(j=1;j<=length2;j++)
{
f[i][j]=f[i-1][j-1]+judge[a[i-1]][b[j-1]];
if((f[i-1][j]+judge[a[i-1]][4])>f[i][j])
f[i][j]=f[i-1][j]+judge[a[i-1]][4];
if((f[i][j-1]+judge[4][b[j-1]])>f[i][j])
f[i][j]=f[i][j-1]+judge[4][b[j-1]];
}
}

cout<<f[length1][length2]<<endl;
}
}

/*
int num,length1,length2;
string s1,s2;
int maxs,cur;
vector<pair<int,int> > st,result;
pair<int,int> pa;

void dfs(int a,int b,int cur)
{
if(a>=length1 || b>=length2)
{
if(maxs<cur) 
{
maxs=cur;
result.clear();
for(vector<pair<int,int> >::iterator it=st.begin();it!=st.end();it++)
{
result.push_back(*it);
}
}
return;
}
if(s1[a]!=s2[b])
{
dfs(a,b+1,cur);
}
else
{
pa.first=a;
pa.second=b;
st.push_back(pa);
dfs(a+1,b+1,++cur);
st.pop_back();
if(!st.empty())
dfs(a+1,(*st.begin()).second+1,--cur);
}
}

void dfs1(int a,int b,int cur)
{
if(a>=length2 || b>=length1)
{
if(maxs<cur) 
{
maxs=cur;
result.clear();
for(vector<pair<int,int> >::iterator it=st.begin();it!=st.end();it++)
{
result.push_back(*it);
}
}
return;
}
if(s2[a]!=s1[b])
{
dfs1(a,b+1,cur);
}
else
{
pa.first=a;
pa.second=b;
st.push_back(pa);
dfs1(a+1,b+1,++cur);
st.pop_back();
if(!st.empty())
dfs1(a+1,(*st.begin()).second+1,--cur);
}
}

int judge(char a,char b)
{
if(a=='-' && b=='-') return 0;
else if(a==b) return 5;
else if((a=='A' && b=='C')||(a=='C' && b=='A')) return -1;
else if((a=='A' && b=='G')||(a=='G' && b=='A')) return -2;
else if((a=='A' && b=='T')||(a=='T' && b=='A')) return -1;
else if((a=='A' && b=='-')||(a=='-' && b=='A')) return -3;

else if((a=='C' && b=='-')||(a=='-' && b=='C')) return -4;
else if((a=='C' && b=='G')||(a=='G' && b=='C')) return -3;
else if((a=='C' && b=='T')||(a=='T' && b=='C')) return -2;

else if((a=='G' && b=='T')||(a=='T' && b=='G')) return -2;
else if((a=='G' && b=='-')||(a=='-' && b=='G')) return -2;

else if((a=='T' && b=='-')||(a=='-' && b=='T')) return -1;
}

int main()
{
int i,j;
int sum;

cin>>num;
while(num--)
{
cin>>length1>>s1>>length2>>s2;

cur=maxs=0;

if(length1<=length2){
st.clear();
dfs(0,0,cur);

i=0;
for(vector<pair<int,int> >::iterator it=result.begin();it!=result.end();it++)
{
if((*it).second>((*it).first+i))
{
for(j=((*it).first+i);j<(*it).second;j++)
{
s1.insert((string::size_type)j,1,'-');
}
i=(*it).second-(*it).first;
}
}

cout<<s1<<endl;

sum=0;
for(i=0;i<s2.length();i++)
{
sum+=judge(s1[i],s2[i]);
}
cout<<sum<<endl;
}
else{
st.clear();
dfs1(0,0,cur);

i=0;
for(vector<pair<int,int> >::iterator it=result.begin();it!=result.end();it++)
{
if((*it).second>((*it).first+i))
{
for(j=((*it).first+i);j<(*it).second;j++)
{
s2.insert((string::size_type)j,1,'-');
}
i=(*it).second-(*it).first;
}
}

sum=0;
for(i=0;i<s1.length();i++)
{
sum+=judge(s1[i],s2[i]);
}
cout<<sum<<endl;
}
}

return 0;
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值