明天是noip day2 day1不写跪就270。写跪就养猪了。。。
lcis的O(NM)算法网上有很多,这个代码也是我暑假从网上看到的,csdn就当作我的储备代码的地方好了
F[I]数组表示以B[I]为结束最长为多长..其余的我也不知道...我都是背代码的= - =
pre记录方案。。。
我是蒟蒻!求rp++ day2正常发挥!
var
q,f,a,b,pre:array[0..1000] of longint;
ans,n,m,i,j,g,k:longint;
begin
ans:=0;
fillchar(f,sizeof(f),0);
read(n);
for i:=1 to n do
read(a[i]);
read(m);
for i:=1 to m do
read(b[i]);
for i:=1 to n do
begin
k:=0;
for j:=1 to m do
begin
if a[i]=b[j] then
if f[j]<(f[k]+1) then
begin
f[j]:=f[k]+1;
pre[j]:=k;
end;
if a[i]>b[j] then
if f[j]>f[k] then k:=j;
end;
end;
for i:=1 to m do
if f[i]>ans then
begin
ans:=f[i];
g:=i;
end;
writeln(ans);
j:=ans;
while j>0 do
begin
q[j]:=g;
j:=j-1;
g:=pre[g];
end;
for i:=1 to ans-1 do
write(q[i],' ');
writeln(q[ans]);
end.
本文介绍了一种解决最长公共子序列问题的O(NM)算法,并提供了具体的实现代码。该算法适用于NOIP等编程竞赛,通过记录以特定元素结尾的最长子序列长度来寻找最优解。
691

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



