2 条题解
-
0
//一维dp解法 #include<bits/stdc++.h> using namespace std; // [1] 全局变量:存储金字塔的总行数 int n; // [2] 全局一维动态规划数组:空间优化版,dp[j]表示当前行第j列位置的最大路径和,复用存储上一行结果 int dp[1100]={}; int main() { // [3] 输入金字塔的总行数 cin>>n; // [4] 创建二维数组arr,存储金字塔数字,索引从1开始,初始值为0 vector< vector<int> > arr(n+1 , vector<int>(n+1,0)); // [5] 循环读取金字塔所有数字,按行存储至arr数组 for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ cin>>arr[i][j]; // [6] 存入第i行第j列的金字塔数字 } } // [7] 一维DP核心遍历:逐行计算每个位置的最大路径和,复用数组节省空间 for(int i=1;i<=n;i++){ // [8] 倒序遍历当前行列数:避免未计算的上一行dp[j-1]值被提前覆盖,保证计算正确性(空间优化关键) for(int j=i;j>=1;j--){ // [9] 更新当前行j列的最大路径和:取上一行j-1/j列的最大值 + 当前位置数字,复用dp数组存储结果 dp[j]=max(dp[j-1],dp[j])+arr[i][j]; } } // [10] 对dp数组排序,使最大路径和移至数组末尾dp[n]位置 sort(dp,dp+n+1); // [11] 输出最终的金字塔最大路径和 cout<<dp[n]; return 0; } -
0
//二维dp解法 #include<bits/stdc++.h> using namespace std; // [1] 全局变量:存储金字塔的总行数 int n; // [2] 全局动态规划数组:dp[i][j]表示从金字塔顶部走到第i行第j列位置时的最大路径和 int dp[1100][1100]={}; int main() { // [3] 输入金字塔的总行数 cin>>n; // [4] 创建二维数组arr,用于存储金字塔的数字,索引从1开始,初始值为0 vector< vector<int> > arr(n+1 , vector<int>(n+1,0)); // [5] 循环读取金字塔每一行的数字 for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ // [6] 将第i行第j列的数字存入arr数组 cin>>arr[i][j]; } } // [7] 初始化最大路径和为0 int max_num=0; // [8] 动态规划遍历计算每个位置的最大路径和 for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ // [9] 当前位置的最大路径和 = 上一行相邻两个位置(j-1和j)的最大路径和 加上 当前数字 // (当i=1时,dp[0][...]为0,自动取当前数字作为初始路径和) dp[i][j]=max(dp[i-1][j-1]+arr[i][j],dp[i-1][j]+arr[i][j]); // [10] 更新全局的最大路径和 max_num=max(dp[i][j],max_num); } } // [11] 输出最终得到的最大路径和 cout<<max_num; return 0; }
- 1
信息
- ID
- 1469
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者