题目链接:点击打开链接
题意:
给你一个表格,表格里有每两个字符相对应的权值。给你两个字符串(基因序列),你可以在基因序列中添加任意的‘-’字符使这两个字符串等长,求这两个字符串对应位置的对应权值的和的最大值。
思路:
参考一下他的博客:点击打开链接
我只说一点:神奇的POJ c++可以过 G++ WA who knows why?
代码如下:
#include <iostream>
using namespace std;
int score['T'+1]['T'+1];
void initial(void)
{
score['A']['A']=5;
score['C']['C']=5;
score['G']['G']=5;
score['T']['T']=5;
score['-']['-']=-5;
score['A']['C']=score['C']['A']=-1;
score['A']['G']=score['G']['A']=-2;
score['A']['T']=score['T']['A']=-1;
score['A']['-']=score['-']['A']=-3;
score['C']['G']=score['G']['C']=-3;
score['C']['T']=score['T']['C']=-2;
score['C']['-']=score['-']['C']=-4;
score['G']['T']=score['T']['G']=-2;
score['G']['-']=score['-']['G']=-2;
score['T']['-']=score['-']['T']=-1;
return;
}
int main()
{
initial();
int T;
cin>>T;
while(T--)
{
int len1, len2;
// string str1, str2;
char* str1=new char[len1+1];
char* str2=new char[len1+1];
cin>>len1>>str1>>len2>>str2;
int **dp = new int*[len1+1];
dp[0] = new int[len2+1];
dp[0][0] = 0;
for(int i = 1;i <= len1;i++)
{
dp[i] = new int[len2 + 1];
dp[i][0] = dp[i-1][0] + score[(int)str1[i-1] ]['-'];
}
for(int i = 1;i <= len2;i++)
dp[0][i] = dp[0][i-1] + score['-'][(int)str2[i-1] ];
for(int i = 1;i <= len1;i++)
for(int j = 1;j <= len2;j++)
{
int t1 = dp[i-1][j] + score[(int)str1[i-1] ]['-'];
int t2 = dp[i][j-1] + score['-'][(int)str2[j-1] ];
int t3 = dp[i-1][j-1] + score[(int)str1[i-1] ][(int)str2[j-1] ];
dp[i][j] = max(t1, max(t2, t3) );
}
cout<<dp[len1][len2]<<endl;
delete dp;
}
return 0;
}