題目描述
小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放着36個價值不等的禮物,每個小的棋盤上面放置着一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裏的禮物小東都能拿到,請設計一個算法使小東拿到價值最高的禮物。
給定一個6*6的矩陣board,其中每個元素爲對應格子的禮物價值,左上角爲[0,0],請返回能獲得的最大價值,保證每個禮物價值大於100小於1000。
分析
可以確定是動態規劃,假設dp[i][j]表示從[0,0]到[i,j]的最大值,有以下四種情況
- i == 0 && j == 0的時候,dp[i][j] = board[0][0]
- i == 0 && j != 0的時候,路徑肯定是[i][j-1]到[i,j]的,dp[i][j] = board[i][j] + dp[i][j-1]
- i != 0 && j == 0的時候,和第二種情況類似,dp[i][j] = board[i][j] + dp[i-1][j]
- 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];
}