題目描述
設(shè)有N×NN \times NN×N的方格圖(N≤9)(N \le 9)(N≤9),我們將其中的某些方格中填入正整數(shù),而其他的方格中則放入數(shù)字000。如下圖所示(見(jiàn)樣例):
A
0? 0? 0? 0? 0? 0? 0? 0
0? 0 13? 0? 0? 6? 0? 0
0? 0? 0? 0? 7? 0? 0? 0
0? 0? 0 14? 0? 0? 0? 0
0 21? 0? 0? 0? 4? 0? 0
0? 0 15? 0? 0? 0? 0? 0
0 14? 0? 0? 0? 0? 0? 0
0? 0? 0? 0? 0? 0? 0? 0
? ? ? ? ? ? ? ? ? ? ? ? B
某人從圖的左上角的AAA點(diǎn)出發(fā),可以向下行走,也可以向右走,直到到達(dá)右下角的BBB點(diǎn)。在走過(guò)的路上,他可以取走方格中的數(shù)(取走后的方格中將變?yōu)閿?shù)字000)。
此人從AAA點(diǎn)到BBB點(diǎn)共走兩次,試找出222條這樣的路徑,使得取得的數(shù)之和為最大。
輸入格式
輸入的第一行為一個(gè)整數(shù)NNN(表示N×NN \times NN×N的方格圖),接下來(lái)的每行有三個(gè)整數(shù),前兩個(gè)表示位置,第三個(gè)數(shù)為該位置上所放的數(shù)。一行單獨(dú)的000表示輸入結(jié)束。
輸出格式
只需輸出一個(gè)整數(shù),表示222條路徑上取得的最大的和。
輸入輸出樣例
輸入 #1
8
2 3 13
2 6? 6
3 5? 7
4 4 14
5 2 21
5 6? 4
6 3 15
7 2 14
0 0? 0
----------------------------------------------------思路---------------------------------------------------------------------
關(guān)鍵是將走兩次的換成是兩個(gè)人的走,狀態(tài)轉(zhuǎn)移方程為:
f[i][j][k][l]=max(f[i?1][j][k?1][l],f[i?1][j][k][l?1],f[i][j?1][k?1][l],f[i][j?1][k][l?1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i?1][j][k?1][l],f[i?1][j][k][l?1],f[i][j?1][k?1][l],f[i][j?1][k][l?1])+a[i][j]+a[k][l];
除此外還要考慮,i=k,j=l的情況,如果相等則應(yīng)相應(yīng)減;
代碼
package 洛谷;
import java.util.Scanner;
public class P1004 {
static int f[][][][]=new int[12][12][12][12];
static int a[][]=new int[12][12];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();int y=sc.nextInt();int z=sc.nextInt();
while(x!=0&&y!=0&&z!=0) {
a[x][y]=z;
x=sc.nextInt();y=sc.nextInt();z=sc.nextInt();
}
for(int i=1;i<=n;i++){
? ? ? ? ? ? for(int j=1;j<=n;j++){
? ? ? ? ? ? ? ? for(int k=1;k<=n;k++){
? ? ? ? ? ? ? ? ? ? for(int l=1;l<=n;l++){
? ? ? ? ? ? ? ? ? ? ? ? f[i][j][k][l]=Math.max(Math.max(f[i-1][j][k-1][l],f[i-1][j][k][l-1]),Math.max(f[i][j-1][k-1][l],f[i][j-1][k][l-1]))+a[i][j]+a[k][l];
? ? ? ? ? ? ? ? ? ? ? ? if(i==k&&l==j)f[i][j][k][l]-=a[i][j];
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
System.out.println(f[n][n][n][n]);
}
}
