啦啦又来发题解了~
今天我们练习了区间合并型的动态规划(一股小学生记叙文的气息扑面而来~
于是三个小时三道题~
还算不错?
1. 数字游戏(dgame)
【题目描述】丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
这个很正常的区间合并
先预处理tot[i,j]表示从i到j总共和
f[i,j,p]表示从i开始j个数(包括j)分成k块最大值(最小值同理
f[i,j,p]:=max(f[i,j,p],f[i,k,p-1]*tot[i+k,i+j-1]);
这样就可以AC啦
今天我们练习了区间合并型的动态规划(一股小学生记叙文的气息扑面而来~
于是三个小时三道题~
还算不错?
1. 数字游戏(dgame)
【题目描述】丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。
这个很正常的区间合并
先预处理tot[i,j]表示从i到j总共和
f[i,j,p]表示从i开始j个数(包括j)分成k块最大值(最小值同理
f[i,j,p]:=max(f[i,j,p],f[i,k,p-1]*tot[i+k,i+j-1]);
这样就可以AC啦
代码
const shuru='dgame.in';
shuchu='dgame.out';
var a:array[0..100] of longint;
f,g:array[0..100,0..100,0..10] of longint;
tot:array[0..100,0..100] of longint;
ans,n,m,i,j,k,p:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a);
exit(b);
end;
procedure init;
begin
assign(input,shuru);
assign(output,shuchu);
reset(input);
rewrite(output);
readln(n,m);
for i:=1 to n do
readln(a[i]);
for i:=n+1 to (n shl 1) do
a[i]:=a[i-n];
for i:=1 to (n shl 1) do
for j:=i to (n shl 1) do
begin
for k:=i to j do
tot[i,j]:=tot[i,j]+a[k];
tot[i,j]:=tot[i,j] mod 10;
while tot[i,j]<0 do
tot[i,j]:=tot[i,j]+10;
end;
dec(m);
close(input);
for i:=1 to 100 do
for j:=1 to 100 do
for k:=1 to 10 do
g[i,j,k]:=maxlongint;
for i:=1 to n