描述 Description | |||
设有N*N的方格图,我们将其中的某些方格填入正整数, 而其他的方格中放入0。 某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角。 在走过的路上,他取走了方格中的数。(取走后方格中数字变为0) 此人从左上角到右下角共走3次,试找出3条路径,使得取得的数总和最大。 输入格式 Input Format 第一行:N (4<=N<=20) 接下来一个N*N的矩阵,矩阵中每个元素不超过10000,不小于0 输出格式 Output Format 一行,表示最大的总和。 |
|||
样例输入 Sample Input | |||
4 1 2 3 4 2 1 3 4 1 2 3 4 1 3 2 4 | |||
样例输出 Sample Output | |||
39 | |||
时间限制 Time Limitation | |||
各个测试点1s |
分析:
f[i,j,k,l]:=Max(f[i-1,j,k,l]),f[i-1,j-1,k,l],f[i-1,j-1,k-1,l],f[i-1,j-1,k,l-1],f[i-1,j-1,k-1,l-1],f[i-1,j,k-1,l],f[i-1,j,k-1,l-1],f[i-1,j,k,l-1]);
加格子权值的时候注意不要重复加.
Code:
1 Function Max(a,b:longint):longint; Begin if a>b Then Exit(a) Else Exit(b); End; 2 Function Min(a,b:longint):longint; Begin if a<b Then Exit(a) Else Exit(b); End; 3 Var 4 i,j,k,l,Tt,n:longint; 5 a:Array[0..21,0..21] of longint; 6 f:Array[0..42,0..21,0..21,0..21] of longint; 7 Begin 8 Read(n); 9 For i:=1 to n do 10 For j:=1 to n do 11 Read(a[i,j]); 12 f[1,1,1,1]:=a[1,1]; 13 For i:=1 to n Shl 1-1 do 14 For j:=1 to Min(n,i) do 15 For k:=1 to Min(n,i) do 16 For l:=1 to Min(n,i) do 17 Begin 18 Tt:=a[j,i-j+1]; 19 if (j<>k) Then inc(Tt,a[k,i-k+1]); 20 if (j<>l) And (k<>l) Then inc(Tt,a[l,i-l+1]); 21 f[i,j,k,l]:=Max(f[i-1,j-1,k,l],f[i-1,j,k,l]); 22 f[i,j,k,l]:=Max(f[i-1,j-1,k-1,l],f[i,j,k,l]); 23 f[i,j,k,l]:=Max(f[i-1,j-1,k,l-1],f[i,j,k,l]); 24 f[i,j,k,l]:=Max(f[i-1,j-1,k-1,l-1],f[i,j,k,l]); 25 f[i,j,k,l]:=Max(f[i-1,j,k-1,l],f[i,j,k,l]); 26 f[i,j,k,l]:=Max(f[i-1,j,k-1,l-1],f[i,j,k,l]); 27 f[i,j,k,l]:=Max(f[i-1,j,k,l-1],f[i,j,k,l]); 28 Inc(f[i,j,k,l],Tt); 29 End; 30 Writeln(f[n Shl 1-1,n,n,n]); 31 End.