[ルーキートレーニング]剣はオファー47を指します。ギフトの最大値(基本dp)

タイトル説明:

m * nチェス盤の各正方形にギフトが置かれ、各ギフトには特定の値(0より大きい値)があります。ボードの左上隅から始めて、グリッド内のギフト取得しボードの右下隅に到達するまで、一度に1マスずつ右または下に移動できますチェス盤とその上の贈り物の価値を考慮して、あなたが得ることができる贈り物の最大値を計算してください?

例1:
入力:
[
[1,3,1]、
[1,5,1]、
[4,2,1]
]
出力:12
説明:パス1→3→5→2→ 1が最大の値を取得できます自分の贈り物

入力:
0 <grid.length <= 200
0 <grid [0] .length <= 200

出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
著作権はLeetCodeが所有しています商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

問題解決のアイデア:

最も基本的なdp問題は、タイトルに従って伝達方程式を見つけるだけで済みます。
タイトルには右に1マス、下1マスしか必要ないため、伝達方程式を導出することは難しくありません。

dp [i] [j] = max(dp [i-1] [j] + grid [i] [j]、dp [i] [j-1] + grid [i] [j])i> 0 && j> 0

また、i = 0の場合、最初の行では、右に移動することによってのみdp値を取得できるため、次のようになります。dp[i] [j] = dp [i] [j-1] + grid [i] [ j] i == 0 && j> 0

j = 0の場合、最初の列で、それらのdp値は下に移動することによってのみ取得できるため、dp [i] [j] = dp [i-1] [j] + grid [i] [j] i> 0 && j == 0

開始点は左上隅です。つまり、i == 0 && j == 0の場合、dp [i] [j] = grid [i] [j]です。

したがって、次の詳細な伝達方程式が得られます
。①開始点:i == 0 && j == 0 dp [0] [0] = grid [0] [0]

②最初の行:i == 0 && j> 0 dp [i] [j] = dp [i] [j-1] + grid [i] [j]は、右に移動することによってのみ到達できます

③最初の列:i> 0 && j == 0 dp [i] [j] = dp [i-1] [j] + grid [i] [j]は、下に移動して到達することしかできません。

④一般的な状況:i> 0 && j> 0 dp [i] [j] = max(dp [i-1] [j] + grid [i] [j]、dp [i] [j-1] + grid [i] [j])右下に移動することで到達できます

注:この問題は、DFSを使用して解決することもできます

コード:

public class jianzhi_Offer_47 {
    
    
    public int maxValue(int[][] grid){
    
    
        if (grid.length == 0){
    
    
            return 0;
        }
        int[][] dp = new int[grid.length][grid[0].length];
        dp[0][0] = grid[0][0];
        for(int i = 0; i < grid.length; i++){
    
    
            for (int j = 0; j < grid[i].length; j++){
    
    
                if(i == 0 && j > 0){
    
    
                    dp[i][j] = dp[i][j-1] + grid[i][j];
                }
                else if(j == 0 && i > 0){
    
    
                    dp[i][j] = dp[i - 1][j] + grid[i][j];
                }
                else if(i > 0 && j > 0) {
    
    
                    dp[i][j] = Math.max(dp[i - 1][j] + grid[i][j], dp[i][j - 1] + grid[i][j]);
                }
            }
        }
        return dp[grid.length - 1][grid[0].length - 1];

    }

    public static void main(String[] args) {
    
    
        jianzhi_Offer_47 obj = new jianzhi_Offer_47();
        int[][] grid = new int[][]{
    
    
                {
    
    1,2,3,4,5},{
    
    1,3,5,2,3},{
    
    3,1,2,5,4},{
    
    4,3,3,5,4}
        };
        System.out.println(obj.maxValue(grid));
    }
}

おすすめ

転載: blog.csdn.net/Puppet__/article/details/115249354