帮忙把这段pascal翻译成c程序
偶没学过pascal 看不懂
type
by200=record {建立数组D}
da:array[1..200,1..200] of byte;
end;
ds1=record {ds1:用于存放任务数据(单个任务)的数据类型}
st:string; {字符串变}
word:array[1..20] of string; {单词数组}
m:integer; {单词个数}
k:integer; {分为k份}
end;
ds=record {ds:用于存放所有任务数据的数据类型}
n:integer; {任务个数}
da:array[1..6] of ds1; {任务数据}
end;
var
i,j,max,a,a1,b,c,d,e,f:integer;
dt,p:^by200; {建立数组D}
dat:array[1..3] of ^by200; {建立数组D}
lo:ds; {lo: 用于存放任务数据}
t:boolean;
st:string;
labels:array[1..200] of byte; {labels:用于存放查找到的单词长度}
procedure loadfile(sn:string); {读文件的过程}
var
fi:text;
t1,t2,t3,t4,t5,t6:integer;
st1:string;
begin
assign(fi,sn);
reset(fi);
readln(fi,lo.n);
for t1:=1 to lo.n do
begin
readln(fi,t2,lo.da[t1].k);
for t3:=1 to t2 do
begin
readln(fi,st1);
lo.da[t1].st:=lo.da[t1].st+st1;
end;
readln(fi,t2);
lo.da[t1].m:=t2;
for t3:=1 to t2 do
readln(fi,lo.da[t1].word[t3]);
end;
close(fi);
end;
begin
writeln;
readln(st);
writeln('Open File : ',st);
loadfile(st);
for a:=1 to 3 do
new(dat[a]); {建立数组D}
for a:=1 to lo.n do
begin
for i:=1 to lo.da[a].m-1 do
for j:=i+1 to lo.da[a].m do
if lo.da[a].word[i][0]>lo.da[a].word[j][0] then {首先对单词进行排序,使单词的长度由小到大排列。
为了保证程序算出的是最优值,长度较小的单词将优先处理}
begin
st:=lo.da[a].word[i];
lo.da[a].word[i]:=lo.da[a].word[j];
lo.da[a].word[j]:=st;
end;
for i:=1 to 200 do
labels[i]:=255;
f:=length(lo.da[a].st); {f是字符串的长度}
for i:=1 to lo.da[a].m do
begin
c:=length(lo.da[a].word[i]);
for j:=1 to f-c+1 do
if (labels[j]=255) and (copy(lo.da[a].st,j,c)=lo.da[a].word[i]) then
labels[j]:=c; {labels[j]表示首字母占用字符串中第j个位置的单词的长度}
end;
for j:=1 to f do
begin
d:=0; {d用于计算D(i,j,1)}
for i:=j downto 1 do
begin
if labels[i]<=j-i+1 then d:=d+1; {如果单词的长度小于i到j的距离,
那么这个单词就包含在ST(i,j)内,如果单词含在ST(i,j)内,那么这个单词一定包含在ST(1 ~ i-1,j)内}
dat[1]^.da[i][j]:=d;
end;
end; {D(1~i,i+1~end,1) 计算完毕(1≦i≦end-1)}
for a1:=1 to lo.da[a].k-1 do {计算D(1,end,k)}
begin
if a1=1 then
begin
i:=1;
j:=2;
end
else
begin
i:=2+(a1 mod 2);
j:=2+((a1+1) mod 2); {通过i,j的交换来实现D(1,end,2~k)的计算}
end;
for b:=1 to f-a1 do
for c:=b+a1 to f do
begin
max:=0;
for d:=b+a1 to c do
begin
e:=dat[i]^.da[b][d-1]+dat[1]^.da[d][c];
if e>max then max:=e; {计算MAX(D(b,d,a)+D(d+1,c,a))}
end;
dat[j]^.da[b][c]:=max;
end;
end;
if lo.da[a].k=1 then j:=1;
writeln(dat[j]^.da[1][f]);
end;
writeln;
end.
或者说说这段程序的算法也可以