sdnu 1038 收集寶藏(動態分析)
阿新 • • 發佈:2019-02-13
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; }