2 条题解

  • 0
    @ 2026-2-3 11:22:38
    //一维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
      @ 2026-2-3 11:22:14
      //二维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
      上传者