題目來源:《信息學奧賽一本通》
時間限制:\(1000ms\) 內存限制:\(64mb\)java
Hello Kitty想摘點花生送給她喜歡的米老鼠。
她來到一片有網格狀道路的矩形花生地(以下圖),從西北角進去,東南角出來。
地裏每一個道路的交叉點上都有種着一株花生苗,上面有若干顆花生,通過一株花生苗就能摘走該它上面全部的花生。
Hello Kitty只能向東或向南走,不能向西或向北走。
問Hello Kitty最多可以摘到多少顆花生。
shell
第一行是一個整數 \(T\) ,表明一共有多少組數據。
接下來是 \(T\) 組數據。
每組數據的第一行是兩個整數,分別表明花生苗的行數 \(R\) 和列數 \(C\) 。
每組數據的接下來 \(R\) 行數據,從北向南依次描述每行花生苗的狀況。每行數據有 \(C\) 個整數,按從西向東的順序描述了該行每株花生苗上的花生數目 \(M\) 。數組
對每組輸入數據,輸出一行,內容爲Hello Kitty能摘到得最多的花生顆數。spa
\(1 ≤ T ≤ 100\) ,
\(1 ≤ R,C ≤ 100\) ,
\(0 ≤ M ≤ 1000\)code
2 2 2 1 1 3 4 2 3 2 3 4 1 6 5
8 16
這類題目用動態規劃的思路來寫。
用一個二維數組 field
存放給出的 \(R\) 行 \(C\) 列的花生地。
而後用一個二維數組 dp
記錄從 第 \(1\) 行第 \(1\) 列,到第 \(R\) 行第 \(C\) 列 的全部方案的最大值。
每個格子的數爲:左和上兩個格子數值較大的一個,再加上本格的花生數。
即:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + field[i][j]
blog
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int t = input.nextInt(); while (t > 0) { int row = input.nextInt(); int col = input.nextInt(); int[][] field = new int[row + 1][col + 1]; for (int i = 1; i <= row; i++) { for (int j = 1; j <= col; j++) { field[i][j] = input.nextInt(); } } int[][] dp = new int[row + 1][col + 1]; for (int i = 1; i <= row; i++) { for (int j = 1; j <= col; j++) { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + field[i][j]; } } System.out.println(dp[row][col]); t--; } input.close(); } }