/*
题目:
	给定一个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;
}

   

12-24 23:56