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 }

 

posted @ 2022-10-19 09:40  爱吃虾滑  阅读(20)  评论(0编辑  收藏  举报