2035433 | 2006-08-21 15:25:00 | Accepted | 1425 | C++ | 00:00.01 | 432K | St.Crux |
这是一道典型的dp题。ZC的解题报告告诉我.......
自己看吧。辛辛苦苦写了15分钟的我的解题报告被Maxthon的鼠标手势给毁了,我真倒霉。
我的算法更加保险,也可以理解为更加笨拙。有一点不明白的地方是为什么他可以用该杀的贪心?这怎么可以用贪心?呜......我就等于O(n^4)了。
#include <cstdio>
#include <string>
int n, an, bn, a[101], b[101], r[101][101];
void dp()
{
int i, k, mx, j, u;
memset(r, 0, sizeof(r));
for(i = 1; i <= an; i ++)
{
for(k = 1; k <= bn; k ++)
{
mx = 0;
if(a[i] != b[k])
{
for(j = i - 1; j > 0; j --)
{
if(a[j] == b[k])
{
for(u = k - 1; u > 0; u --)
{
if(b[u] == a[i])
{
if(u && j && mx < r[j - 1][u - 1] + 2)
{
mx = r[j - 1][u - 1] + 2;
}
}
}
}
}
}
if(mx < r[i - 1][k])
mx = r[i - 1][k];
if(mx < r[i][k - 1])
mx = r[i][k - 1];
if(mx < r[i - 1][k - 1])
mx = r[i - 1][k - 1];
r[i][k] = mx;
}
}
}
void print()
{
//pr();
printf("%d\n", r[an][bn]);
}
int main()
{
//freopen("in.txt", "r", stdin);
scanf("%d", &n);
int i, k;
for(i = 0; i < n; i ++)
{
scanf("%d %d", &an, &bn);
for(k = 1; k <= an; k ++)
{
scanf("%d", &a[k]);
}
for(k = 1; k <= bn; k ++)
{
scanf("%d", &b[k]);
}
dp();
print();
}
return 0;
}
评论