Noip2003p2 数字游戏

36 篇文章 0 订阅
18 篇文章 0 订阅

题目:

 数字游戏

来源:

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值