年終獎問題

題目描述

小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放着36個價值不等的禮物,每個小的棋盤上面放置着一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裏的禮物小東都能拿到,請設計一個算法使小東拿到價值最高的禮物。
給定一個6*6的矩陣board,其中每個元素爲對應格子的禮物價值,左上角爲[0,0],請返回能獲得的最大價值,保證每個禮物價值大於100小於1000。

分析

可以確定是動態規劃,假設dp[i][j]表示從[0,0]到[i,j]的最大值,有以下四種情況

  1. i == 0 && j == 0的時候,dp[i][j] = board[0][0]
  2. i == 0 && j != 0的時候,路徑肯定是[i][j-1]到[i,j]的,dp[i][j] = board[i][j] + dp[i][j-1]
  3. i != 0 && j == 0的時候,和第二種情況類似,dp[i][j] = board[i][j] + dp[i-1][j]
  4. i != 0 && j != 0的時候,dp[i][j] = max{dp[i][j-1], dp[i-1][j]} + board[i][j]

最後輸出dp[5][5]就可以了

代碼

    public static int getMost(int[][] board) {
        // write code here
        int max[][] = new int[6][6];
        for (int i = 0; i != 6; i++) {
            for (int j = 0; j != 6; j++) {
                if (i == 0 && j == 0) {
                    max[i][j] = board[i][j];
                } else if (i == 0) {
                    max[i][j] = board[i][j] + max[i][j - 1];
                } else if (j == 0) {
                    max[i][j] = board[i][j] + max[i - 1][j];
                } else {
                    max[i][j] = Math.max(max[i - 1][j], max[i][j - 1]) + board[i][j];
                }
            }
        }
        return max[5][5];
    }
發佈了40 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章