二維數組的DP問題

問題:平面上有N*M個格子,每一個格子中放着必定數量的蘋果。你從左上角的格子開始,每一步只能向下走或是向右走,每次走到一個格子上就把格子裏的蘋果收集起來,這樣下去,你最多能收集到多少個蘋果java

解決思路:動態規劃

一、抽象狀態,這個問題的狀態很簡單,就是走到第i行第j列的格子的時候,收集到的最大蘋果數

F[i][j],其中0<=i<=N,0<=j<=M
複製代碼

二、問題轉換方程,動態規劃的思想就是要求原問題的解就要去子問題的解,這道題的子問題就是,找出可以到達當前格子的全部前一個格子的收集最大蘋果數,而後加上當前格子的蘋果數便可

F[I][j] = A[i][j]+max{if i>0:F[i-1][j] ; if j>0 :F[i][j-1]} //注意這裏要考慮,若是第一行和第一列的特殊狀況
複製代碼
  • 源碼

import java.util.Scanner;
public class MaxApple {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int[][] A = new int[N][M];
        int[][] F = new int[N][M];
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                A[i][j] = scanner.nextInt();
            }
        }
        F[0][0]=A[0][0];  //初始化第一個格子

        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                int tempMax = Integer.MIN_VALUE;
                if(i==0&&j>0&&F[i][j-1]+A[i][j]>tempMax)  //第一行的狀況
                    tempMax = F[i][j-1]+A[i][j];
                if(j==0&&i>0&&F[i-1][j]+A[i][j]>tempMax)  //第一列的狀況
                    tempMax = F[i-1][j]+A[i][j];
                if(i>0&&j>0&&Math.max(F[i][j-1]+A[i][j],F[i-1][j]+A[i][j])>tempMax)
                    tempMax = Math.max(F[i][j-1]+A[i][j],F[i-1][j]+A[i][j]);
                if(i>0||j>0)
                F[i][j] = tempMax;
            }
        }
        System.out.println(F[N-1][M-1]);
    }
}
複製代碼
相關文章
相關標籤/搜索