一、題目描述
小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個6*6的棋盤上進行,上面放着36個價值不等的禮物,每個小的棋盤上面放置着一個禮物,他需要從左上角開始遊戲,每次只能向下或者向右移動一步,到達右下角停止,一路上的格子裏的禮物小東都能拿到,請設計一個算法使小東拿到價值最高的禮物。
給定一個6*6的矩陣board,其中每個元素爲對應格子的禮物價值,左上角爲[0,0],請返回能獲得的最大價值,保證每個禮物價值大於100小於1000。
二、思路
該題目可分爲三步來進行:
第一列:f(i, 0) = f(i-1, 0) + board(i, 0) //數組可能只有一行
第一行:f(0,j) = f(0, j - 1) + b(0, j) // 數組可能只有一列
其它位置:f(i, j) = max{f(i-1, j), f(i, j - 1)} + board(i, j) //數組不止一行一列
返回最右下角的值
三、代碼
class Bonus {
public:
int getMost(vector<vector<int> > board) {
int length = board.size();
int wideth = board[0].size();
vector<vector<int>> allprice;
for(int i = 0; i < length; ++i){
vector<int> tmp(wideth,0);
allprice.push_back(tmp);
}
allprice[0][0] = board[0][0];
for(int i = 0; i < length; ++i){
for(int j = 0; j < wideth; ++j){
if(i == 0 && j == 0)
continue;
//如果走在行的臨界邊,也就是第一行,那麼他只能向右走
//向右走的時候該點就要將後面的值加起來。
else if(i == 0){
allprice[i][j] = allprice[i][j - 1] + board[i][j];
}
//如果走在列的臨界邊,也就是第一列,那麼他只能向下走
//向下走的時候該點就要將上面的值加起來。
else if(j == 0){
allprice[i][j] = allprice[i - 1][j] + board[i][j];
}
//除去兩個臨界邊,剩下的就是既能向右走,也能向下走,
//這時候就要考慮走到當前點的所有可能得情況,也就是走到當前點
//各自路徑的和是不是這些所有到達該點路徑當中最大的了。
else{
allprice[i][j] = max(allprice[i - 1][j],allprice[i][j - 1]) + board[i][j];
}
}
}
//返回最右下角的就是最大值
return allprice[length - 1][wideth - 1];
}
};