讨论 / 思路--
lizhixin 2010-05-13 20:54:00
点我顶贴 收藏 删除
这是别人的:

解题报告

个人认为是这次最难的一道,因为要使用动态规划的思想,搜索可能要超时。

由于求最小值和求最大值的过程大致相同,所以我们就以求最大值为例。

首先,由于这是一个环,所以我们要将它断开,断开的位置要枚举。我们在读入数据时,直接将负数和大于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的情况。其实存的时候只要使用滚动数组,第二维可省略。

#1 lizhixin@2008-07-10 01:10:00
回复 删除
But it can truely AC it:

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???

#2 lizhixin@2008-07-10 01:22:00
回复 删除
哪个个炮会沉迷于这种游戏?!

不符和逻辑嘛

跑跑卡丁车都比这强

学OI到一定境界了就是不一样....

#3 leapoahead@2010-05-13 20:54:00
回复 删除
按题目意思MS就是没有0.。。
查看更多回复
提交回复