動態規劃之年終獎

一、題目描述

小東所在公司要發年終獎,而小東恰好獲得了最高福利,他要在公司年會上參與一個抽獎遊戲,遊戲在一個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];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章