2021寒假每日一題《摘花生》

摘花生

題目來源:《信息學奧賽一本通》
時間限制:\(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

解題代碼-Java

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();
    }
}
相關文章
相關標籤/搜索