描述 Description 乌龟非常热爱跳格子,尤其是写有数字的格子。他发明了一种新型的跳格子游戏。
在一列格子中(共N个格子),每个格子上都写着分数Di,乌龟要从第一个格子开始跳,跳到最后一个格子上。(第一个格子的分数不能得到,因为乌龟没有跳到第一个格子上)。
乌龟一次最多跳P格,最少跳1格。乌龟跳T格,跳到第x个格子上时,跳跃的得分是T*Dx。
总得分等于各次跳跃得分之和。
为了让游戏更有趣味,乌龟希望总得分除以M的余数最大。
输入格式 Input Format 输入的第一行有三个正整数N,P,M。空格隔开。
接下来N行,每行1个数,为每个格子的分数Di(非负整数)。
输出格式 Output Format 输出仅包含一个数字,为总得分除以M的余数的最大值。样例输入 Sample Input [复制数据](http://tyvj.cpwz.cn/Problem_Show.asp?id=1246# "复制数据")
5 2 12
5
4
6
7
1
样例输出 Sample Output [复制数据](http://tyvj.cpwz.cn/Problem_Show.asp?id=1246# "复制数据") 8时间限制 Time Limitation 1s
注释 Hint 对于10%的数据,P≤1。
对于40%的数据,2≤N≤5,1<P≤2。
对于100%的数据,P≤10≤N≤100,M≤10000。
这道题是一个判断性动态规划,第一次遇到,有点小小的困难,写的不好,能不能看懂看你RP了............
判断性动态规划,开的数组是布尔型,所以............
DP方程:fi,j: 表示第i个格子上余数为j的数是不是存在.
fi,j=true 不难推到 fi+k,(a\[i+k*k+j)mod m]=true(k表示走的步数1..p)
【参考程序】
var n,p,m,i,j,k,bb:longint;
a:array[1..110] of longint;
f:array[1..2000,0..10000] of boolean;
begin
readln(n,p,m);
for i:=1 to n do
begin
readln(a[i]);
a[i]:=a[i] mod m;
end;
f[1,0]:=true;
for i:=1 to n do
for j:=0 to m do
if f[i,j] then
for k:=1 to p do
f[i+k,(a[i+k]*k+j) mod m]:=true;
for i:=m downto 0 do
if f[n,i] then
begin
writeln(i);
exit;
end;
end.