解题报告
个人认为是这次最难的一道,因为要使用动态规划的思想,搜索可能要超时。
由于求最小值和求最大值的过程大致相同,所以我们就以求最大值为例。
首先,由于这是一个环,所以我们要将它断开,断开的位置要枚举。我们在读入数据时,直接将负数和大于9的数都变成0到9范围内。
用a[i,j]表示前i个数,分成j组后乘积的最大值。
状态转移方程是:
a[i,j]=max{a[i-1,j-1]*s[i..i], a[i-2,j-1]*s[i-1..i], … , a[j-1,j-1]*s[1..i]} (i>=j)
a[0,0]=1;
a[i,0]无意义 (i<>0)
a[i,j]无意义 (i<j)
其中s[u..v]表示第u个数到第v个数之和。其实这就是在枚举最后一组有几个数。
我们要的求是最大的a[n,m]。
编程的时候要注意数中间有0的情况。其实存的时候只要使用滚动数组,第二维可省略。
program Project1;
var a,b,c,d:array[0..1000]of longint;
n,m,i,j,u,max,min,k,t,amins,amaxs:longint;
function s(l,r:longint):longint;
var q:integer;
begin
s:=0;
for q:=l to r do inc(s,a[q]);
s:=s mod 10;
end;
begin
amins:=maxlongint;amaxs:=0;
readln(n,m);
for i:=1 to n do
begin
readln(b[i]);
if b[i]<0 then b[i]:=(b[i]-10*(b[i] div 10-1)) mod 10;
b[i]:=b[i] mod 10;
end;
for u:=1 to n do
begin
for i:=u to u+n-1 do a[i-u+1]:=b[(i-1) mod n+1];
for i:=1 to n do
begin
c[i]:=s(1,i);
d[i]:=c[i];
end;
for j:=2 to m do
for i:=n downto j do
begin
max:=0;min:=maxlongint;
for k:=1 to i-j+1 do
begin
t:=c[i-k]*s(i-k+1,i);
if max<t then max:=t;
if min>t then min:=t;
end;
c[i]:=max;d[i]:=min;
end;
if amins>d[n] then amins:=d[n];
if amaxs<c[n] then amaxs:=c[n];
end;
writeln(amins);
writeln(amaxs);
end.
But I havent consider the zero,what for I should think about it???