本題為典型的動態規劃,關鍵找出序列比對的3個不同情況,即子問題
設d[i][j]為取s1第i個字元,s2第j個字元時的最大分值
則決定p為最優的情況有三種 p數組為分數矩陣
1、 s1取第i個字母,s2取“ - ”: d[i-1][j]+p[ s1[i-1] ]['-'];
2、 s1取“ - ”,s2取第j個字母:d[i][j-1]+p['-'][ s2[j-1] ];
3、 s1取第i個字母,s2取第j個字母:d[i-1][j-1]+p[ s1[i-1] ][ s2[j-1] ];
即dp[i][j]為上述三種情況的最大值
易犯錯誤
1、p數組的初始化,不細心的話容易犯錯(因為這個低級錯誤WA兩次- -)
2、d[0][j],d[i][0],d[0][0]邊界值的賦值
Source Code
| Problem: 1080 |
|
User: yangliuACMer |
| Memory: 568K |
|
Time: 0MS |
| Language: C++ |
|
Result: Accepted |
#include <iostream>using namespace std;#define maxlen 200#define MININF -1;int max3(int x, int y, int z){int a = x>y?x:y;return a>z?a:z;}int main(){int p[maxlen][maxlen], d[maxlen][maxlen];char s1[maxlen], s2[maxlen];int len1,len2,T,i,j;p['A']['A']=5;//表格的初始化一定要細心,不要因為表格輸入錯誤而WA p['C']['C']=5; p['G']['G']=5; p['T']['T']=5; p['-']['-']=MININF; p['A']['C']=p['C']['A']=-1; p['A']['G']=p['G']['A']=-2; p['A']['T']=p['T']['A']=-1; p['A']['-']=p['-']['A']=-3; p['C']['G']=p['G']['C']=-3; p['C']['T']=p['T']['C']=-2; p['C']['-']=p['-']['C']=-4; p['G']['T']=p['T']['G']=-2; p['G']['-']=p['-']['G']=-2; p['T']['-']=p['-']['T']=-1;cin>>T;while(T--){cin>>len1>>s1>>len2>>s2;memset(d, 0, sizeof(d));for(i = 1; i <= len1; i++){d[i][0] = d[i-1][0] + p[s1[i-1]]['-'];}for(i = 1; i < len2; i++){d[0][i] = d[0][i-1] + p['-'][s2[i-1]];}for(i = 1; i <= len1; i++){for(j = 1;j <= len2; j++){d[i][j] = max3(d[i-1][j-1] + p[s1[i-1]][s2[j-1]], d[i][j-1] + p['-'][s2[j-1]], d[i-1][j] + p[s1[i-1]]['-']);}}cout<<d[len1][len2]<<endl;}return 0;}