算法基础之数字三角形

数字三角形

  • 核心思想:线性dp

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

    • 从下往上传值 父节点fij = max(fi+1j , fi+1j+1) + wij

    • 初始化最后一层 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;
        }
相关推荐
爱学堂IT分享2 分钟前
图灵Java互联网架构师六期
java·开发语言
传奇开心果编程12 分钟前
【Rust入门知识点学与练】第3课:String 与 &str 的区别
开发语言·学习·rust
秋名RG23 分钟前
Java 核心特性一览
java·开发语言
平头哥AI1 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
HugoStudio_SWAN1 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
葡萄城技术团队1 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei2 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟2 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
一晌小贪欢2 小时前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
青 春 记 忆2 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode