算法基础之数字三角形

发布时间:2023年12月25日

数字三角形

  • 核心思想:线性dp

    • 集合的定义为 f[i][j] –> 到i j点的最大距离

    • 从下往上传值 父节点f[i][j] = max(f[i+1][j] , f[i+1][j+1]) + w[i][j]

    • 初始化最后一层 f = w

    • 在这里插入图片描述

    •   #include <bits/stdc++.h>
        
        using namespace std;
        
        const int N = 510;
        
        int w[N][N],f[N][N];
        int n;
        
        int main()
        {
            cin >> n;
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= i; j++)
                    cin >> w[i][j];
        
            for(int i=1;i<=n;i++) f[n][i] = w[n][i]; 
            for (int i = n - 1; i >= 1; i--)
                for (int j = 1; j <= i; j++)
                    f[i][j] = max(f[i + 1][j + 1], f[i + 1][j]) + w[i][j];  //左孩子和右孩子取最大 + 距离
        
            cout << f[1][1] << endl;
        }
      
    • 优化版:

      •   #include <bits/stdc++.h>
          
          using namespace std;
          
          const int N = 510;
          
          int f[N][N];
          int n;
          
          int main()
          {
              cin >> n;
              for (int i = 1; i <= n; i++)
                  for (int j = 1; j <= i; j++)
                      cin >> f[i][j];
          
              for (int i = n - 1; i >= 1; i--)
                  for (int j = 1; j <= i; j++)
                      f[i][j] = max(f[i + 1][j + 1], f[i + 1][j]) + f[i][j];
              		//用完f[i][j]距上一层距离 就将其更新成距底部距离
          
              cout << f[1][1] << endl;
          }
        
文章来源:https://blog.csdn.net/Pisasama/article/details/135188801
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。