1 条题解

  • 0
    @ 2025-8-6 14:29:55
    #include <iostream>
    using namespace std;
    typedef long long ll;  // 定义ll为long long的缩写,用于大数(本程序未使用)
    
    int a[1010][1010];  // 存储数字塔,如:
                        // a[1][1]
                        // a[2][1] a[2][2]
                        // a[3][1] a[3][2] a[3][3]
    
    int dp[1010][1010]; // 存储从塔顶到当前位置的最大路径和
    
    int main(){
    	int n;  // 数字塔的层数
    	cin >> n;  // 输入层数
    	
    	// 读入数字塔数据
    	for(int i = 1; i <= n; i++) {        // 从第1层到第n层
    		for(int j = 1; j <= i; j++) {    // 每层有i个数字
    			cin >> a[i][j];              // 输入当前位置的数字
    		}
    	}
    	
    	// 初始化:塔顶的最大路径和就是它自己的值
    	dp[1][1] = a[1][1];
    	
    	// 从第2层开始向下计算
    	for(int i = 2; i <= n; i++) {        // 从第2层到第n层
    		for(int j = 1; j <= i; j++) {    // 计算当前层的每个位置
    			// 关键:当前位置的最大路径和 =
    			//       上方两个位置中较大的值 + 当前位置的数字
    			dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];
    		}
    	}
    	
    	// 在最后一层(底层)寻找最大值
    	int mx = 1;  // 假设第一个位置是最大值
    	for(int i = 2; i <= n; i++) {  // 从第二个位置开始比较
    		if(dp[n][i] > dp[n][mx]) { // 如果找到更大的值
    			mx = i;               // 更新最大值位置
    		}
    	}
    	
    	// 输出从塔顶到底层的最大路径和
    	cout << dp[n][mx];
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    319
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者