其实是一道奇怪的DP题,蒟蒻又不会做。。。
看了Vfk的题解才算弄明白是怎么一回事:
令f[i, j]表示i维有j个球时最大切割部分,则
f[i, j] = f[i, j - 1] + f[i - 1, j - 1]
其中第一部分很好理解,就是前j - 1个球的最大个数,然后就是第二部分的理解:
j - 1个球后再加一个球,于是最优的情况就是最后一个球与前j - 1个球都相交
而求面试i - 1维的,相交出来的是i - 2维空间 <=> i - 1维空间用j - 1个i - 2个球划分的最优个数。
证毕。。。
1 /************************************************************** 2 Problem: 1197 3 User: rausen 4 Language: Pascal 5 Result: Accepted 6 Time:0 ms 7 Memory:264 kb 8 ****************************************************************/ 9 10 var 11 n, m : longint; 12 f : array[0..20, 0..200] of int64; 13 cal : array[0..20, 0..200] of boolean; 14 15 procedure pre_work; 16 var 17 i, j : longint; 18 19 begin 20 for i := 1 to n do begin 21 f[i, 1] := 2; 22 cal[i, 1] := true; 23 end; 24 for j := 1 to m do begin 25 f[1, j] := 2 * j; 26 cal[1, j] := true; 27 end; 28 end; 29 30 function calc(x, y : longint) : int64; 31 begin 32 if cal[x, y] then exit(f[x, y]); 33 cal[x, y] := true; 34 f[x, y] := calc(x - 1, y - 1) + calc(x, y - 1); 35 exit(f[x, y]); 36 end; 37 38 begin 39 readln(m, n); 40 fillchar(cal, sizeof(cal), false); 41 pre_work; 42 writeln(calc(n, m)); 43 end.
(p.s. 程序是P的不要怪我>.<。。。是以前写的。。。!)
时间: 2024-11-16 12:35:24