/*
*@剑指offer
*@47.礼物的最大价值
*@edited by ryunin
*@date:2019/04/26
// 面试题47:礼物的最大价值
// 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
// (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
// 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
// 算你最多能拿到多少价值的礼物?
*/
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
int maxValue(vector<vector<int>> &vec)
{
vector<vector<int>> maxVal(4, vector<int>(4)); //二维vector的初始化
int rows = vec[0].size();
int cols = vec.size();
int boundR = 0; //上边界
int boundC = 0; //左边界
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<cols;j++)
{
int spy0 = maxVal[0][0];
if(i == 0)
{
if(j == 0)
{
boundR = vec[0][0];
boundC = vec[0][0];
maxVal[0][0] = boundR;
continue;
}
else
{
boundR += vec[0][j];
maxVal[0][j] = boundR;
continue;
}
}
if(j == 0)
{
boundC += vec[i][0];
maxVal[i][0] = boundC;
continue;
}
int spy = max(maxVal[i][j-1],maxVal[i-1][j]);
maxVal[i][j] = max(maxVal[i][j-1],maxVal[i-1][j])+vec[i][j];
}
}
for(int i = 0;i<rows;i++)
{
for(int j = 0;j<cols;j++)
{
cout<<maxVal[i][j]<<endl;
}
}
return maxVal[rows - 1][cols - 1];
}
};
int main()
{
vector<vector<int>> vecs = {{1,10,3,8},{12,2,9,6},{5,7,4,11},{3,7,16,5}};
cout<<Solution().maxValue(vecs)<<endl;
}