算法基础之数字三角形

数字三角形

  • 核心思想:线性dp

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

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

    • 初始化最后一层 f = w

    cpp 复制代码
      #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;
      }
    • 优化版:

      cpp 复制代码
        #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;
        }
相关推荐
春日见16 小时前
眼在手上外参标定保姆级教学---离线手眼标定(vscode + opencv)
linux·运维·开发语言·人工智能·数码相机·计算机视觉·matlab
宵时待雨16 小时前
C语言笔记归纳20:文件操作
c语言·开发语言·笔记·算法
椰子今天很可爱17 小时前
仿照muduo库实现一个高并发服务器
linux·服务器·c++
alphaTao18 小时前
LeetCode 每日一题 2025/12/15-2025/12/21
算法·leetcode
kkai人工智能19 小时前
AI写作:从“废话”到“爆款”
开发语言·人工智能·ai·ai写作
写写闲篇儿20 小时前
下一个更大元素(一)
数据结构·算法
MobotStone1 天前
从金鱼记忆到过目不忘:Transformer 如何让AI真正理解一句话?
算法
lizz311 天前
C++模板编程:从入门到精通
java·开发语言·c++
炽烈小老头1 天前
【每天学习一点算法 2025/12/19】二叉树的层序遍历
数据结构·学习·算法
shoubepatien1 天前
JAVA -- 05
java·开发语言