两个都是经典题。
第一题:最大连续子段和,DP。f(i)表示1~i的以i结尾的最大连续子段和是多少(也就是你程序中的t)。那么当f(i)<0的话,显然下一个数就不要与f(i)连起来了,为什么呢?比如说,现在数列的1 -3 1。那么f(2)=-2。这时候算f(3)的话,显然f(3)=1比f(3)=-2+1=-1优。最后答案就是所有f(i)的最大值。
第二题:还是DP。先把兵不能走的地方标记出来(也就是马能到的地方)(也就是程序中的b数组)。然后f(i,j)表示兵走到(i,j)这个格子的方案数(也就是程序中的a数组)。那么f(i,j)=f(i-1,j)+f(i,j-1)。因为只有(i-1,j)和(i,j-1)可以走到(i,j)这个格子。最后就输出f(n,m)就可以了。
1先把4位数的千,百,十,个位标为A,B,C,D,用函数取出A,B,C,D为4个字符,再把A,B,C,D转为数字,比较A=DB=C符合列出,不符合开始验证下一个。
22个加数各2位,算上“+”号共5位字符,先用函数取出前两个字符转为数字,再取出后两个字符转为数字,两个数字相加,把得到的数字转为字符列出。
program gen;
var c:char;s:string;n,p:integer;
people:array[150000]of string;
father:array[150000]of longint;
ff:array['A''Z',150000]of longint;
nn:array['A''Z']of longint;
function search(s:string):longint;
var i:longint;
begin
search:=0;
for i:=1 to nn[s[1]] do
if people[ff[s[1],i]]=s then begin search:=ff[s[1],i];break;end;
end;
procedure insert_father(s:string);
var k:longint;
begin
k:=search(s);
if k=0 then begin
inc(n);
people[n]:=s;
inc(nn[s[1]]);
ff[s[1],nn[s[1]]]:=n;
father[n]:=0;
p:=n;
end
else p:=k;
end;
procedure insert_son(s:string);
var k:longint;
begin
k:=search(s);
if k=0 then begin
inc(n);
people[n]:=s;
inc(nn[s[1]]);
ff[s[1],nn[s[1]]]:=n;
father[n]:=p;
end
else father[k]:=p;
end;
function find(s:string):string;
var k:longint;
begin
k:=search(s);
while father[k]<>0 do k:=father[k];
find:=people[k];
end;
begin
assign(input,'genin');reset(input);
assign(output,'genout');rewrite(output);
read(c);
while c<>''do
begin
readln(s);
case c of
'#':insert_father(s);
'+':insert_son(s);
end;
read(c);
end;
while c<>'$' do
begin
readln(s);
writeln(s,' ',find(s));
read(c);
end;
close(input);close(output);
end
随便给一个了,希望喜欢
以上就是关于两段简单pascal程序求算法分析【急!!】全部的内容,包括:两段简单pascal程序求算法分析【急!!】、2个初级新手简单的pascal语言程序 请进、pascal求几道题的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)