题目: | 最长公共子序列 | |
来源: | Tyvj 1050 | |
题目大意: | 一行两个用空格隔开的字符串,求其最长公共子序列 | |
数据范围: | 两个串的长度均小于2000 | |
样例: | abccd aecd | 3 |
做题思路: | While读到空格,然后结束一个,另一个开始然后动规 f[i,j]= f[i-1,j-1]+1;( s1[i]=s2[j]) max(f[i-1,j],f[i,j-1]) | |
知识点: | 动态规划、最长公共子序列 |
var
i,j,m,n:longint;
x,y:array[1..3000]of char;
f:array[0..3000,0..3000]of longint;
begin
i:=1;
read(x[1]);
while x[i]<>' ' do{<读入第一个字符串>}
begin
inc(i);
read(x[i]);
end;
dec(i);
while not eoln do{<读入第二个字符串>}
begin
inc(j);
read(y[j]);
end;
m:=i;n:=j;
fillchar(f,sizeof(f),0);
fori:=1 to m do
forj:=1 to n do
ifx[i]=y[j] then f[i,j]:=f[i-1,j-1]+1{<动态规划转移方程>}
else
if f[i-1,j]>=f[i,j-1] then
f[i,j]:=f[i-1,j]
else f[i,j]:=f[i,j-1];
writeln(f[m,n]);
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1050