1038.收集宝藏 SDNUOJ1038

Description
有一个n*n的矩阵,矩阵每个格子中都有一些宝藏,从左上角(1, 1)出发,每次只能向下或者向右移动一格,已知每个格子中宝藏的价值,求走到右下角(n, n)时能收集到的宝藏的总最大价值。
Input
第一行为一个整数n(1 <= n <= 1000),表示矩阵的行、列数。
接下来n行,每行n个整数,每个整数表示当前格子的宝藏价值(不超过10000)。
Output
一个整数,表示能收集到的宝藏的最大总价值。
Sample Input
4
1 2 3 10
3 4 1 1
5 2 1 1
1 3 1 1
Sample Output
19

假设最优答案:m【i】【j】
建立原问题与子问题之间的联系:
如果走到【I】【j】的位置,它上一步是【I - 1】【j】或者是【I】【j - 1】
取这两步的最大值,就建立起来联系。
迭代公式建立
m[i][j] = max(m[i - 1][j] + a[i][j], m[i][j - 1] + a[i][j]);

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[1005][1005];
int v[1005][1005];

int main()
{
    int n;
    while(cin >> n)
    {
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j)
                scanf("%d", &a[i][j]);
        ///边界计算
        v[0][0] = a[0][0];
        for(int i = 1; i < n; ++i)
            v[i][0] = v[i - 1][0] + a[i][0];
        for(int i = 1; i < n; ++i)
            v[0][i] = v[0][i - 1] + a[0][i];
        ///正文计算
        for(int i = 1; i < n; ++i)
            for(int j = 1; j < n; ++j)
                v[i][j] = max(v[i - 1][j] + a[i][j], v[i][j - 1] + a[i][j]);
        cout << v[n - 1][n - 1] << '\n';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/85337102
今日推荐