最长公共子序列 TYVJ1050 解题报告

本文介绍了一种解决最长公共子序列问题的算法实现。通过双重循环比较两个字符串中的每个字符,采用动态规划的方法记录最长公共子序列的长度。文章详细展示了程序流程,并附带完整的Pascal代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
program P1050;

var
	bs,cs:ansistring;
	f:array [0..2000,0..2000] of longint;//f[i,j]表示在bs串中前i个,cs串前j个的最长公共长度
	
procedure init;
var
	ch:char;
begin
	fillchar(f,sizeof(f),0);
	bs:=';
	cs:=';
	read(ch);
	bs:=bs+ch;
	while ch<>' ' do 
		begin
			read(ch);
			bs:=bs+ch;
		end;
	delete(bs,length(bs),1);
	readln(cs);
end;

function max(x,y:longint):longint;
begin
	if x>y then exit(x) else exit(y);
end;

procedure main;
var
	i,j:longint;
begin
	//通过一个双重循环求解,对于确定的i位同每一个j位进行配对
	for i:=1 to length(bs) do
		begin
			for j:=1 to length(cs) do
				begin
					if bs[i]=cs[j] then f[i,j]:=f[i-1,j-1]+1//如果bs的第i位与cs的第j位相同,则说明它们是由i-1位,j-1位转移而来的并加上1(因为出现一个公共序列)
					else if bs[i]<>cs[j] then f[i,j]:=max(f[i-1,j],f[i,j-1]);//否则就保持其中一个位置不动,寻找i的前一位或j的前一位并取一个最大值              
				end;
		end;
	//对于每一个状态,都能保证是由前面某个最大值转移而来的
end;

begin
	assign(input,'P1050.in'); reset(input);
	assign(output,'P1050.out'); rewrite(output);
	
	init;
	main;
	writeln(f[length(bs),length(cs)]);
	
	close(input); close(output);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值