这道题的AC率很高啊,有50%多,觉得有些奇怪,感觉应该在30%才对,不管了。
需要说明的是这一题中使用的分值矩阵map[][]是经过我变形的,这样变形后,使用起来会更加方便,尤其是对于'X'对'-'的情况可以直接减去表示的值就是它们之间的分值,当然,相应在输入时也已经把字母变成了数字方便后面直接用做map矩阵的下标查表。
这道题是很正统的DP动态规划,所以采用了标志矩阵check表示是否计算过,value矩阵存储已经算好的值。
刚开始出WA我反复检查,直到感觉消灭干净了逻辑错误,却还是WA,百思不得其解,随手把check矩阵的初始化范围改成MAXN而不是仅仅初始使用的部分,结果就AC了。。。结果速度还真是快,只是C++比C用的内存大,大就大,反正习惯了。
时间:00:00.00
内存:904K
#include <iostream>
using namespace std;

#define MAXN 101

/**///////////////////////- T G A C
int map[5][5] = ...{...{0, -1, -2, -3, -4},//-

...{-1, 5, -2, -1, -2},//T

...{-2, -2, 5, -2, -3},//G

...{-3, -1, -2, 5, -1},//A

...{-4, -2, -3, -1, 5}};//C
bool check[MAXN][MAXN];//标志矩阵,标志是否计算过
int value[MAXN][MAXN];//存储已经计算过的值

void readd(int x[], int &len)

...{
char temp[MAXN];
cin >> len;
cin >> temp;
for(int i=0;i<len;i++)

...{
if('T' == temp[i]) x[i] = 1;
else if('G' == temp[i]) x[i] = 2;
else if('A' == temp[i]) x[i] = 3;
else x[i] = 4;//C
}
}

int sim(int a[], int b[], int alen, int blen)

...{
if(check[alen][blen])//已经算过的

...{
return value[alen][blen];
}
else//未算过的

...{
if(alen>0 && blen>0)

...{
int kv,temp;
kv = sim(a,b,alen,blen-1) - b[blen-1];
temp = sim(a,b,alen-1,blen) - a[alen-1];
if(temp>kv)
kv = temp;
temp = sim(a,b,alen-1,blen-1) + map[a[alen-1]][b[blen-1]];
if(temp>kv)
kv = temp;
check[alen][blen] = true;
value[alen][blen] = kv;
return kv;
}
else if((0==alen) && blen>0)

...{
int temp = sim(a,b,0,blen-1)-b[blen-1];
check[0][blen] = true;
value[0][blen] = temp;
return temp;
}
else if((0==blen) && alen>0)

...{
int temp = sim(a,b,alen-1,0)-a[alen-1];
check[alen][0] = true;
value[alen][0] = temp;
return temp;
}
}
}

void solve()

...{
int len1,len2;
int x1[MAXN],x2[MAXN];
readd(x1,len1);
readd(x2,len2);
for(int i=0;i<MAXN;i++)

...{
for(int j=0;j<MAXN;j++)
check[i][j] = false;
}
check[0][0] = true;
value[0][0] = 0;
cout << sim(x1,x2,len1,len2) << endl;
}

int main()

...{
int t;
// freopen("1027.txt","r",stdin);
cin >> t;
while(t--)
solve();
// fclose(stdin);
return 0;
}
