2018-02

这个题目有点类似leetcode上面的,62和63题。

题目:给定一个M行N列的矩阵(M*N个格子),每个格子中放着一定数量的平安果。你从左上角的各自开始,只能向下或者向右走,目的地是右下角的格子。每走过一个格子,就把格子上的平安果都收集起来。求你最多能收集到多少平安果。意:当经过一个格子时,需要一次性把格子里的平安果都拿走。限制条件:1<N,M<=50;每个格子里的平安果数量是0到1000(包含0和1000).

输入描述:输入包含两部分:第一行M, N接下来M行,包含N个平安果数量

输出描述:一个整数最多拿走的平安果的数量

示例:

输入
2 4
1 2 3 40
6 7 8 90

输出
136

程序如下:

int maxApples(vector<vector<int>>& apples)
{
    int m = apples.size();
    int n = apples[0].size();
    if (m < 1 || n < 1) return 0;
    vector<vector<int>> d(m,vector<int>(n,0));
    d[0][0] = apples[0][0];

    for (int j = 1; j < n; j++)
        d[0][j] = d[0][j - 1] + apples[0][j];
    for (int i = 1; i < m; i++)
        d[i][0] = d[i - 1][0] + apples[i][0];

    for (int i = 1; i < m; i++)
    {
        for (int j = 1; j < n; j++)
        {
            d[i][j] = max(d[i - 1][j], d[i][j - 1]) + apples[i][j];
        }
    }

    return d[m-1][n-1];
}

int main()
{
    int m = 0;
    int n = 0;
    cin >> m;
    cin >> n;
    vector<vector<int>> apples(m,vector<int>(n,0));

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> apples[i][j];
        }
    }

    cout << maxApples(apples);

    return 0;
}

 

posted @ 2020-07-26 18:30  repinkply  阅读(321)  评论(0)    收藏  举报