这道题的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;
}
本文介绍了一种使用动态规划解决序列比对问题的方法,包括分值矩阵的设计与实现细节。通过具体代码示例展示了如何高效地进行相似度计算。
898

被折叠的 条评论
为什么被折叠?



