Elanuelo_PVP 2025-02-09 19:57 采纳率: 0%
浏览 18

11分求调试,DP题



```c++
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005],r,a[1005][1005];
int main()
{
    cin>>r;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>a[i][j];
        }
    }
    dp[1][1]=a[1][1];
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(i!=1 and j!=1)
            {
                if(j==i)
                {
                    dp[i][j]==dp[i-1][j-1];
                }
                if(j==1)
                {
                    dp[i][j]==dp[i-1][j];
                }
                else
                {
                    dp[i][j]=max(dp[i-1][j-1],dp[i-1][j]);
                }
            }
        }
    }
    cout << dp[r][r];
    return 0;
}

```

  • 写回答

7条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-02-09 19:57
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    ### 问题分析 你的 C++ 程序与动态规划相关,主要是求解一个特定的三角形的最大路径和。这个三角形中的值在输入部分被读取,并且程序通过动态规划策略来计算从顶到底的最大和。

    代码功能说明

    1. 输入部分:首先,程序会读取一个整数 r,表示三角形的行数。然后,循环读取每一行的值,存储到数组 a 中。
    2. 动态规划部分
      • 定义 dp[i][j] 作为到达三角形第 i 行第 j 列的最大路径和。
      • 初始化 dp[1][1] = a[1][1],这是三角形的顶点。
      • 遍历三角形,对于每个位置 dp[i][j],根据其上方的两个可能的父节点(即 dp[i-1][j-1]dp[i-1][j]),更新其值为:
        • 如果 j == 1,只能由 dp[i-1][j] 传递过来。
        • 如果 j == i,只能由 dp[i-1][j-1] 传递过来。
        • 否则,选择两个父节点中的最大值。
    3. 输出结果:最后输出 dp[r][r],即三角形底部右端的最大路径和。

    示例

    假设输入的三角形如下:

      2
     3 4
    6 5 7
    4 1 8 3
    

    程序的输入可能如下:

    4
    2
    3 4
    6 5 7
    4 1 8 3
    

    输出将会是最大路径和,步骤如下: - 计算路径: - 从 2(顶点)到 3 或 4 - 对于选择 3:6 + 3 = 9 - 对于选择 4:5 + 7 = 12 - 对于选择 7:8 + 3 = 11 - 最大路径和为 2 + 4 + 7,即 13

    完整代码

    下面是经过格式化和修正后的代码:

    #include <bits/stdc++.h>
    using namespace std;
    int dp[1005][1005], r, a[1005][1005];
    int main() {
        cin >> r;
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= i; j++) {
                cin >> a[i][j];
            }
        }
        dp[1][1] = a[1][1];  // 初始化顶点
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= i; j++) {
                if (i != 1 && j != 1) {
                    if (j == i) {
                        dp[i][j] = dp[i - 1][j - 1] + a[i][j];  // 从左上方过来
                    } else if (j == 1) {
                        dp[i][j] = dp[i - 1][j] + a[i][j];  // 从正上方过来
                    } else {
                        dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + a[i][j]; // 选择最大路径
                    }
                }
            }
        }
        int maxPathSum = 0;
        for (int j = 1; j <= r; j++) { // 寻找底边的最大路径和
            maxPathSum = max(maxPathSum, dp[r][j]);
        }
        
        cout << maxPathSum;  // 输出结果
        return 0;
    }
    

    总结

    这个程序利用动态规划计算从三角形顶端到底端的最大路径和,充分展示了动态规划的思想。通过引入状态转移方程,可以有效地解决复杂的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月9日