AcWing 898.数字三角形
题目链接:http://www.acwing.com/activity/content/problem/content/1002/
跟着学到这里了,那就顺便复习一下吧。
两种方式可以完成:
线性dp 和 倒序dp。倒序可以说是线性的优化吧,节省了空间复杂度。
线性dp
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N = 510, INF = 0x3f3f3f3f; 5 int n; 6 int a[N][N]; //存储三角形中的每一个点 7 int dp[N][N]; //存储状态 8 9 int main() 10 { 11 cin >> n; 12 //输入三角形 13 for(int i = 1; i <= n; i ++) 14 for(int j = 1; j <= i; j ++) 15 cin >> a[i][j]; 16 //三角形存储状态初始化 17 for(int i = 1; i <= n; i ++) 18 for(int j = 0; j <= i+1; j ++)//将三角形两侧也初始化,避免越界 19 dp[i][j] = -INF; 20 21 dp[1][1] = a[1][1]; 22 //寻找 23 for(int i = 2; i <= n; i ++) 24 for(int j = 1; j <= i; j ++) 25 dp[i][j] = max(dp[i-1][j-1] + a[i][j], dp[i-1][j] + a[i][j]); 26 //遍历最后一行找到最大值并输出 27 int res = -INF; 28 for(int j = 1; j <= n; j ++) res = max(res, dp[n][j]); 29 cout << res << endl; 30 31 return 0; 32 }
倒序dp
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=510; 5 int f[N][N]; 6 int n; 7 8 int main() 9 { 10 cin>>n; 11 for(int i=1; i<=n; i++) 12 for(int j=1; j<=i; j++) 13 cin>>f[i][j]; 14 15 for(int i = n; i >= 1; i--) 16 for(int j = i; j >= 1; j--) 17 f[i][j] = max(f[i+1][j], f[i+1][j+1]) + f[i][j]; 18 19 cout<<f[1][1]<<endl; 20 21 return 0; 22 }