最长公共上升子序列 LCIS O(NM) 方案

本文介绍了一种解决最长公共子序列问题的O(NM)算法,并提供了具体的实现代码。该算法适用于NOIP等编程竞赛,通过记录以特定元素结尾的最长子序列长度来寻找最优解。

明天是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.
	  


RP++

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值