四維動(dòng)態(tài)規(guī)劃

題目描述

設(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]);

}

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評(píng)論 0 2
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,036評(píng)論 0 2
  • 計(jì)算機(jī)二級(jí)C語(yǔ)言上機(jī)題庫(kù)(南開(kāi)版) 1.m個(gè)人的成績(jī)存放在score數(shù)組中,請(qǐng)編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,614評(píng)論 1 42
  • 有時(shí)候在想,自己的寫的稿子如果不過(guò)的話,就換一家去投,投三家或許是事不過(guò)三吧我覺(jué)得這樣子挺好的,如果都不行,我就發(fā)...
    愛(ài)喝酒的阿酒閱讀 180評(píng)論 0 2
  • 當(dāng)大地蘇醒時(shí),,就代表溫暖的春天即將來(lái)臨了?;玳L(zhǎng)出來(lái)新芽,開(kāi)出燦爛、美麗的花兒;大樹(shù)期待小鳥(niǎo)來(lái)它頭頂筑巢,能在晨...
    徐陽(yáng)華閱讀 264評(píng)論 0 2

友情鏈接更多精彩內(nèi)容