898. 數字三角形
阿新 • • 發佈:2020-09-07
經典dp問題
自上向下dp
#include<iostream> #include<cstring> using namespace std; const int N = 510, INF = 0x3f3f3f3f; int f[N][N], a[N][N]; int n; int main(){ memset(f, 128, sizeof f); cin >> n; for(int i = 1; i <= n; i ++) for(int j = 1; j <= i; j ++) cin >> a[i][j]; f[1][1] = a[1][1]; for(int i = 2; i <= n; i ++) for(int j = 1; j <= i; j ++) f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j]; int res = -INF; for(int i = 1; i <= n; i ++) res = max(res, f[n][i]); cout << res; return 0; }
自下向上dp
#include<iostream> #include<cstring> using namespace std; const int N = 510; int f[N][N], a[N][N]; int n; int main(){ cin >> n; for(int i = 1; i <= n; i ++) for(int j = 1; j <= i; j ++) cin >> a[i][j]; for(int i = n; i >= 0; i --) f[n][i] = a[n][i]; for(int i = n - 1; i >= 1; i --) for(int j = 1; j <= i; j ++) f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j]; cout << f[1][1]; return 0; }
記憶化搜尋
#include<iostream> #include<cstring> using namespace std; const int N = 510; int f[N][N], a[N][N], st[N][N]; int n; int dfs(int x, int y){ if(x == n) return a[x][y]; if(!st[x][y]){ st[x][y] = 1; f[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + a[x][y]; } return f[x][y]; } int main(){ // memset(f, 128, sizeof f); cin >> n; for(int i = 1; i <= n; i ++) for(int j = 1; j <= i; j ++) cin >> a[i][j]; cout << dfs(1, 1); return 0; }