1樓:
n<3000的遊碧御不會,不過n<300的還是可以寫的:
var i,j,k,n:longint;
f:array[0..300,0..300,0..300]of integer;
a,b:array[1..300]of integer;
function max(a,b:integer):integer;
beginif(a>神巖慧逗b)then exit(a);
exit(b);
end;begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do read(b[i]);
for k:=1 to 300 do beginfor i:=1 to n do beginfor j:
1 to n do beginif(a[i]=b[j])and(a[i]endelse begin
f[i,j,k]:=max(f[i-1,j,k],f[i,j-1,k]);
end;end;
end;end;
writeln(f[n,n,300]);
end.
lcis最長公共上公升子序列pascal
2樓:網友
有o(n*log(n))的演算法,只要用陣列保留長度為下標的序列 的最小值,從右想左掃,同時更新,在、查詢的時候用二分。具體找下關鍵字,有很多人留下了不錯的文章,至於n^3 的演算法簡直是浪費時間,沒必要學,
pascal 最長的字串型別是什麼
3樓:網友
pchar:無限長度(無法直接物型使用字串函式)
ansistring:2g長罩攜猜度(與隱緩一般字串用法相同,只不過不能wacthes)
(最長)公共子串怎麼用pascal語言編?
4樓:網友
動態規劃。
樓上的未免太慢了吧。
program test;
vars1,s2:string;
i,j,best,p,q,r:longint;
a:array[0..300,0..300] of longint;
beginread(s1); readln;
read(s2);
for i:=1 to length(s1) dofor j:=1 to length(s2) dobegin
if s1[i]=s2[j] then
beginbest:=0;
p:=a[i-1,j-1]+1;
q:=a[i,j-1];
r:=a[i-1,j];
if p>q then best:=p else best:=q;
if r>best then best:=r;
a[i,j]:=best;
endelse
beginbest:=0;
p:=a[i,j-1];
q:=a[i-1,j];
if p>q then best:=p else best:=q;
a[i,j]:=best;
end;end;
writeln(a[length(s1),length(s2)])
end.
最長上公升序列 pascal 動態
5樓:天ぅ殤
第五個是二好不好,二自己本身算乙個,然後前面的一也算乙個,共兩個。
最長公共子序列ii pascal
6樓:夢中碧浪
這道題可以用貪心的思路在o(n)的時間內做出來。
因為序列是環,首先把序列複製一遍加在序列尾部,然後列舉i=1->2*n,用s記錄以i為結尾的已知序列取得的最大值,列舉i時,將序列的第i位加到s上,一旦s<0,則將s賦值為0。全過程用max記錄s曾經取得的最大值,注意長度不能超過n。
如何編「最長上公升子序列」?((pascal)要遞迴)
7樓:網友
vari,j,k,m,n:longint;
a:array[1..1000] of longint;
f:array[1..1000] of longint;
beginreadln(n);
for i:= 1 to n do
read(a[i]);
for i:= 1 to n do
beginm:=0;
for j:= 1 to i-1 do
if (a[i]>a[j]) and (f[j]>m) then m:=f[j];
f[i]:=m+1;
end;m:=0;
for i:= 1 to n do
if f[i]>m then m:=f[i];
writeln(m);
這個題是標準的動態規劃,不要複雜化了。
8樓:雨後de殺戮
動態規劃解法。
f[1]:=1;
max:=f[1];
for i:=2 to n do
beginfor j:=1 to i-1 doif (a[j]f[i]) then f[i]:=f[j];(找最大的f[j]);
f[i]:=f[i]+1;(如果前面沒有比a[i]大的則f[i]=1否則為f[i]+1);
end;writeln(max);
end.
pascal 組合字串
9樓:網友
其實我不是很明白題目的意思。
var n,k,i,j,sum:longint;
b:array[1..26] of boolean;
temp:char;
s:string;
procedure f(s0:string);
var i:longint;
beginif sum=k then exit;
if length(s0)=4 then beginwriteln(s0);
inc(sum);
exit;end;
for i:=1 to n do beginif b[i] then continue;
b[i]:=true;
f(s0+s[i]);
b[i]:=false;
end;end;
beginreadln(n,k);
readln(s);
for i:=1 to length(s) dofor j:=i+1 to length(s) do if s[i]>s[j] then begin
temp:=s[i]; s[i]:=s[j]; s[j]:=temp;
end;f('');
end.