/*
题目:
给定一个m*n的棋盘,每格放一个礼物(每个礼物的值大于0),
从左上角出发,向下或向右走到达右下角,得到的礼物和最大。
*/
/*
思路:
f(i,j)=max[f(i-1,j),f(i,j-1)] + a[i,j]
*/
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int getMaxValue(const int* values,int rows,int cols){
if(rows <= 0 || cols <= 0) return 0;
int *maxValues = new int[cols];
maxValues[0] = values[0];
for(int col = 1; col < cols; col++){
maxValues[col] = maxValues[col-1] + values[col];
}
for(int row = 1; row < rows; row++){
for(int col = 0; col < cols; col++){
if(col == 0){
maxValues[0] = maxValues[0] + values[row * cols + col];
}else{
maxValues[col] = max(maxValues[col-1],maxValues[col]) + values[row * cols + col];
}
}
}
return maxValues[cols - 1];
}
int main(){
int values[]={1,10,3,8,12,2,9,6,5,7,4,11,3,7,16,5};
cout<<getMaxValue(values,4,4);
return 0;
}