这道题的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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
MAXN 101
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
//- T G A C
int
map[
5
][
5
]
=
...
{...{0, -1, -2, -3, -4},//-
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{-1, 5, -2, -1, -2},//T
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{-2, -2, 5, -2, -3},//G
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{-3, -1, -2, 5, -1},//A
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{-4, -2, -3, -1, 5}}
;
//
C
bool
check[MAXN][MAXN];
//
标志矩阵,标志是否计算过
int
value[MAXN][MAXN];
//
存储已经计算过的值
void
readd(
int
x[],
int
&
len)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
char temp[MAXN];
cin >> len;
cin >> temp;
for(int i=0;i<len;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
sim(
int
a[],
int
b[],
int
alen,
int
blen)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(check[alen][blen])//已经算过的
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return value[alen][blen];
}
else//未算过的
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(alen>0 && blen>0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
int temp = sim(a,b,alen-1,0)-a[alen-1];
check[alen][0] = true;
value[alen][0] = temp;
return temp;
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
solve()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int len1,len2;
int x1[MAXN],x2[MAXN];
readd(x1,len1);
readd(x2,len2);
for(int i=0;i<MAXN;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int t;
// freopen("1027.txt","r",stdin);
cin >> t;
while(t--)
solve();
// fclose(stdin);
return 0;
}