题目: | 数字游戏 | |
来源: | Noip2003p2 | |
题目大意: | N个数围成一个环,将其分成m组,使得每组之和mod 10之后相乘最大、最小,输 出他们。无论正负数mod 后都为正的。。 | |
数据范围: | 1<=n<=50,1<=m<=9 | |
样例: | 4 2 4 3 -1 2 | 7 81 |
做题思路: | 感觉和石子合并很像,都是环都是求最大、最小 f[i,j,k]=max{f[i,j,k],f[i,p,k-1]*sum[p+1,j](j-1>=p>=i)} 这个题我fillchar了半天结果都wa,然后手动初始化的才过了,这是为何?哎。。边 界啊。 | |
知识点: | Dp |
var
f1,f2:array[0..110,0..110,0..10]of longint;
a:array[0..110]of longint;
sum:array[0..110,0..110]of longint;
n,m,i,j,k,p,max,min:longint;
begin
readln(n,m);
fori:=1 to n do
begin
readln(a[i]);
a[i+n]:=a[i];
end;
n:=n*2;
fori:=1 to n do
forj:=1 to n do
begin
p:=0;
fork:=i to j do
inc(p,a[k]);
p:=p mod 10;
ifp<0 then inc(p,10);
sum[i,j]:=p;
end;
max:=-maxlongint;min:=maxlongint;
// fillchar(f1,sizeof(f1),128);{<将自己的错误摆出来,劝诫别人也警戒自己,注意边界不要图省事>}
//fillchar(f2,sizeof(f2),127);
fori:=1 to n do
forj:=1 to n do
fork:=1 to m do
begin
f1[i,j,k]:=-10000000;
f2[i,j,k]:=10000000;
end;
fori:=1 to n do
forj:=i to n do
begin
f1[i,j,1]:=sum[i,j];
f2[i,j,1]:=sum[i,j];
end;
fori:=1 to n do
forj:=i to n do
fork:=2 to m do
forp:=j-1 downto i do
begin
if f1[i,j,k]<f1[i,p,k-1]*sum[p+1,j] thenf1[i,j,k]:=f1[i,p,k-1]*sum[p+1,j];
if f2[i,j,k]>f2[i,p,k-1]*sum[p+1,j] thenf2[i,j,k]:=f2[i,p,k-1]*sum[p+1,j];
end;
n:=ndiv 2;
fori:=1 to n do
begin
ifmax<f1[i,i+n-1,m] then max:=f1[i,i+n-1,m];
ifmin>f2[i,i+n-1,m] then min:=f2[i,i+n-1,m];
end;
writeln(min);writeln(max);
end.
题目来源:
http://yuanti.tyvj.cn:8080/Problem_Show.asp?id=1035