題目背景
問世間,青春期爲何物?
答曰:“甲亢,甲亢,再甲亢;捱餓,捱餓,再捱餓!”
題目描述
正處在某一特定時期之中的李大水牛由於消化系統比較發達,最近一直處在飢餓的狀態中。某日上課,正當他餓得頭昏眼花之時,眼前突然閃現出了一個n*m(n and m<=200)的矩型的巨型大餐桌,而自己正處在這個大餐桌的一側的中點下邊。餐桌被劃分爲了n*m個小方格,每一個方格中都有一個圓形的巨型大餐盤,上面盛滿了令李大水牛朝思暮想的食物。李大水牛已將餐桌上所有的食物按其所能提供的能量打了分(有些是負的,因爲吃了要拉肚子),他決定從自己所處的位置喫到餐桌的另一側,但他喫東西有一個習慣——只吃自己前方或左前方或右前方的盤中的食物。
由於李大水牛已餓得不想動腦了,而他又想獲得最大的能量,因此,他將這個問題交給了你。
每組數據的出發點都是最後一行的中間位置的下方!
輸入輸出格式
輸入格式:
[輸入數據:]
第一行爲m n.(n爲奇數),李大水牛一開始在最後一行的中間的下方
接下來爲m*n的數字距陣.
共有m行,每行n個數字.數字間用空格隔開.代表該格子上的盤中的食物所能提供的能量.
數字全是整數.
輸出格式:
[輸出數據:]
一個數,爲你所找出的最大能量值.
輸入輸出樣例
輸入樣例#1: 複製
6 7 16 4 3 12 6 0 3 4 -5 6 7 0 0 2 6 0 -1 -2 3 6 8 5 3 4 0 0 -2 7 -1 7 4 0 7 -5 6 0 -1 3 4 12 4 2
輸出樣例#1: 複製
41
說明
快喫!快喫!快喫!
題解:和數字金字塔題目解法相同,只不過這裏需要判斷的方向有三個,對於開始位置,有f[i][j]=max(f[i-1][j-1],f[i-1][j],f[i-1][j+1])+a[i][j].其中f[i][j]代表在i,j位置能獲得最大值,f[i-1][j]、f[i-1][j-1]、f[i-1][j+1]分別對應i,j位置的前、左前、右前能獲得的最大值,最後取開始的三個位置的最大值就行了。
import java.util.*;
/*
*Likecloud-喫、喫、喫
*/
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
int x=m,y=n/2+1;
int[][] a=new int[m+2][n+2];
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
a[i][j]=in.nextInt();
}
}
int[][] dp=new int[m+2][n+2];
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
dp[i][j]=Math.max(Math.max(dp[i-1][j-1], dp[i-1][j]), dp[i-1][j+1])+a[i][j];
}
}
System.out.println(Math.max(Math.max(dp[x][y-1], dp[x][y]), dp[x][y+1]));
}
}