1. 程式人生 > >sdnu 1038 收集寶藏(動態分析)

sdnu 1038 收集寶藏(動態分析)

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>

using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    static int a[1010][1010] = {0};
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
        scanf("%d", &a[i][j]);
    static int m[1010][1010] = {0};
    m[1][1] = a[1][1];
    for(int i = 2; i <= n; i ++)
        m[i][1] = m[i - 1][1] + a[i][1];
    for(int i = 2; i <= n; i ++)
        m[1][i] = m[1][i - 1] + a[1][i];
        for(int i = 2; i <= n; i ++)
            for(int j = 2; j <= n; j ++)
            m[i][j] = max(m[i-1][j]+a[i][j],m[i][j-1]+a[i][j]);
        printf("%d\n", m[n][n]);
        return 0;
}