标签 动态规划 下的文章

在传统行业的数字化转型进程中,人工智能的角色正在发生结构性变化。早期阶段,AI 更多被视为效率工具,用于替代人工完成单点任务;而随着大语言模型工程化落地,行业开始进入以“智能体”为核心的新阶段——智能体来了,这一变化正在重塑企业对 AI 的理解方式与应用边界。

当前,行业内部已逐渐形成清晰分水岭:一类企业停留在“能用 AI”,另一类则开始探索“用对 AI”。差异不只体现在技术层面,更体现在是否对业务逻辑本身进行重构。

一、从工具化应用到智能体系统

传统的工具化 AI,通常承担的是单一能力增强角色,例如文本生成、信息检索或规则判断。这类系统依赖人工触发,不具备持续推理和目标规划能力,其价值主要体现在局部效率提升。

相比之下,智能体并非单一模型调用,而是一类具备目标导向的计算系统。其核心特征包括:

  • 能将复杂目标拆解为可执行的任务序列
  • 能在执行过程中保留上下文与历史经验
  • 能根据结果反馈动态调整行动路径

这使得 AI 从“被动响应工具”转变为“过程参与者”。

二、传统行业的关键差异:用得上 vs 用得准

在制造、能源、金融、物流等高复杂度行业中,这种差异尤为明显。

“能用 AI”的企业,通常聚焦于流程表层优化,例如自动生成报告、替代人工查询、提升处理速度。这类应用虽然改善体验,但并未改变原有的业务决策逻辑。

“用对 AI”的企业,关注的是逻辑层面的对齐:

  • 是否将行业经验转化为 AI 可理解的决策约束
  • 是否让 AI 的推理过程符合真实业务规则
  • 是否将结果评价从“回答是否合理”转向“目标是否达成”

这标志着 AI 应用从“工具引入”进入“系统嵌入”阶段。

三、工程实现的核心转向

从工程视角看,“用对 AI”通常具备以下特征:

  • 动态规划而非固定脚本智能体根据中间结果调整下一步行动,而非执行预设流程。
  • 行业知识强约束通过私有知识库与检索增强生成机制,确保输出符合行业规范,减少通用模型的不确定性。
  • 结果导向的评价体系不再以响应速度或文本相关性为核心指标,而是关注业务目标完成度与合规性。

四、实现路径:逻辑重塑而非功能堆叠

在实践中,传统行业要实现智能体化,通常需要完成三项基础工作:

  1. 业务流程原子化将宏观目标拆解为可被系统调用的细粒度操作单元,使 AI 能够在推理过程中准确选择工具。
  2. 行业知识结构化将标准、规则、案例转化为结构化知识,为智能体提供稳定的决策依据。
  3. 反馈闭环与记忆机制通过持续记录执行结果,将成功经验和失败约束沉淀为长期规则,实现系统级优化。

五、长期视角下的行业变化

随着智能体逐步嵌入核心流程,传统行业的价值结构也在发生转移:

  • 决策能力开始从“个人经验”转向“系统逻辑”
  • 成本结构从人力密集转向算力与逻辑资产
  • 风险控制从事前防错转向过程治理,通过多层校验与人工介入机制实现可控自动化

结语

智能体在传统行业的落地,并非简单的技术升级,而是一次对业务逻辑表达方式的重构。真正具备长期价值的,不是模型本身,而是行业是否能够将多年积累的隐性经验,转化为可被 AI 持续执行和优化的结构化逻辑。

在这一过程中,传统行业不是被动的技术接受者,而是智能系统规则的定义者。

题目描述

给你⼀根⻓度为n 的绳⼦,请把绳⼦剪成整数⻓的m 段( m 、n 都是整数, n>1 并 且m>1 , m<=n ),每段绳⼦的⻓度记为k[1],...,k[m]。请问k[1]x...xk[m] 可能的最⼤乘积是多少?例如,当绳⼦的⻓度是8 时,我们把它剪成⻓度分别为2 、3 、3 的三段,此时得到的最⼤乘积是18`。

输⼊描述:输⼊⼀个数n,意义⻅题⾯。(2 <= n <= 60)

返回值描述:输出答案。

示例1
输⼊:8
返回值:18

思路及解答

备忘录

本题的解答思路就是每个⻓度的绳⼦,要么最⻓的情况是不剪开(⻓度是本身),要么⻓度是剪开两段的乘积。因此每个⻓度 length 都需要遍历两个相加之后等于 length 的乘积,取最⼤值。

初始化值⻓度为 1 的值为 1 ,从⻓度为 2 开始,每⼀种⻓度都需要遍历两个⼦⻓度的乘积。

显然,为了避免多次重复计算,可以写个备忘录

public class Solution {
    public int cutRope(int target) {
        if (target <= 1) {
            return target;
        }
        int[] nums = new int[target + 1];
        nums[1] = 1;
        nums[0] = 1;
        for (int i = 2; i <= target; i++) {
            int max = i;
            for(int j=0;j<=i/2;j++){
                int temp = nums[j] * nums[i-j];
                if(temp > max){
                    max = temp;
                }
            }
            nums[i]=max;
        }
        return nums[target];
    }
}

动态规划

⽤动态规划的思维来做,假设绳⼦⻓度为 n 的 最⼤的⻓度为 f(n) ,那你说 f(n) 怎么计算得来呢?

  1. f(n) 可能是 n(不切分)
  2. 也可能是 f(n-1) 和 f(1) 的乘积
  3. 也可能是 f(n-2) 和 f(2) 的乘积
  4. ......

那么也就是想要求 f( n ) 我们必须先把 f(n-1) , f(n-2) ...之类的前⾯的值先求出来, f(1)=1 这是初始化值。

public class Solution {
    public int cutRope(int target) {
        int[] dp = new int[target + 1];
        dp[1] = 1;
        for (int i = 2; i <= target; i++) {
            for (int j = 1; j < i; j++) {
                dp[i] = Math.max(dp[i], (Math.max(j, dp[j])) * (Math.max(i - j, dp[i - j])));
            }
        }
        return dp[target];
    }
}
  • 时间复杂度:O(n²),外层循环n-3次,内层循环i/2次
  • 空间复杂度:O(n),需要dp数组存储中间结果

贪心算法(最优解)

基于数学推导的贪心策略,优先剪出长度为3的段。当n≥5时,优先剪出长度为3的段;剩余4时剪成2×2

为什么选择3?

  1. 数学证明:当n ≥ 5时,3(n-3) ≥ 2(n-2) > n
  2. 接近自然底数e:最优分段长度应接近e ≈ 2.718,3是最接近的整数
  3. 4的特殊处理:2×2 > 3×1,所以剩余4时剪成2×2而不是3×1
public class Solution {
    public int cutRope(int n) {
        // 特殊情况处理
        if (n <= 3) return n - 1;
        
        // 计算可以剪出多少段长度为3的绳子
        int countOf3 = n / 3;
        
        // 处理剩余部分:当剩余长度为1时,调整策略
        if (n - countOf3 * 3 == 1) {
            countOf3--; // 减少一段3,与剩余的1组成4
        }
        
        // 计算剩余部分能剪出多少段长度为2的绳子
        int countOf2 = (n - countOf3 * 3) / 2;
        
        // 计算结果:3的countOf3次方 × 2的countOf2次方
        return (int)(Math.pow(3, countOf3)) * (int)(Math.pow(2, countOf2));
    }
}
  • 时间复杂度:O(1),只有常数次操作
  • 空间复杂度:O(1),只使用固定变量

数学公式法(理论最优)

根据n除以3的余数直接套用公式

public class Solution {
    public int cutRope(int n) {
        if (n <= 3) return n - 1;
        
        int countOf3 = n / 3;
        int remainder = n % 3;
        
        // 根据余数直接返回结果
        if (remainder == 0) {
            return (int) Math.pow(3, countOf3);
        } else if (remainder == 1) {
            return (int) Math.pow(3, countOf3 - 1) * 4;
        } else { // remainder == 2
            return (int) Math.pow(3, countOf3) * 2;
        }
    }
}
  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

题目描述

地上有⼀个 m ⾏和 n 列的⽅格。⼀个机器⼈从坐标(0,0) 的格⼦开始移动,每⼀次只能向左,右,上,下四个⽅向移动⼀格,但是不能进⼊⾏坐标和列坐标的数位之和⼤于 k 的格⼦。 例如,当k 为 18 时,机器⼈能够进⼊⽅格(35,37) ,因为 3+5+3+7 = 18 。但是,它不能进⼊⽅格(35,38) ,因为 3+5+3+8 = 19 。请问该机器⼈能够达到多少个格⼦?

示例1

输⼊:5,10,10
返回值:21

示例2

输⼊:10,1,100
返回值:29

说明:[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 这29种,后⾯的[0,29] , [0,30] 以及[0,31] 等等是⽆法到达的。

思路及解答

DFS(深度优先搜索)

深度优先搜索算法,也就是 DFS ,⾸先需要初始化数组,注意是 boolean 类型的⼆元数组。边初始化
边计算位数的和,判断如果⼤于等于阈值的话,就直接置为 true ,也就是已经被访问到(但是这⼀部分计⼊结果)。

然后遍历每⼀个元素,只要 i , j 不在合法的索引范围或者是已经被访问过,都会直接返回
false 。

否则的话,可访问的数量 +1 ,并且递归遍历上下左右四个元素,返回最终的可访问的个数。

DFS 会优先同⼀个⽅向,⼀直⾛下去,不撞南墙不回头,直到条件不满⾜的时候,才会回头。回头之后,每次只会回头⼀步,往另外⼀个⽅向去,同样是⼀头扎进去。

假设有⼀个 4 x 4 的⽅格,从第⼀个开始遍历,假设遍历顺序是上,右,下,左,那么遍历的顺序如下:

public class Solution {
    public int movingCount(int threshold, int rows, int cols) {
        if (rows > 0 && cols > 0) {
            boolean[][] visited = new boolean[rows][cols];
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    // 如果⼤于阈值,设置已被访问过
                    visited[i][j] = ((getSum(i) + getSum(j)) > threshold);
                }
            }
            return getNum(visited, 0, 0, 0);
        }
        return 0;
    }
    
   // 获取可以被访问的个数
   private int getNum(boolean[][] visited, int i, int j, int count) {
        if (i < 0 || j < 0 || i >= visited.length || j >= visited[0].length ||
            visited[i][j]) {
            return count;
        }
        count++;
        visited[i][j] = true;
        count = getNum(visited, i, j + 1, count);
        count = getNum(visited, i, j - 1, count);
        count = getNum(visited, i + 1, j, count);
        count = getNum(visited, i - 1, j, count);
        return count;
   }
   
    // 计算位数之和
   private int getSum(int num) {
        int result = 0;
        while (num > 0) {
            result = result + num % 10;
            num = num / 10;
        }
        return result;
    }
}
  • 时间复杂度:最坏的情况是将所有的格⼦都遍历⼀遍, O(m*n) 。
  • 空间复杂度:借助了额外的空间保存是否被访问过,同样为O(m*n) 。

BFS(⼴度优先搜索)

⼴度优先搜索,也就是没进⾏⼀步,优先搜索当前点的各个⽅向上的点,不急着往下搜索,等搜索完当前点的各个⽅向的点,再依次把之前搜索的点,取出来,同样先搜索周边的点...

这样直到所有都被搜索完成。

同样有⼀个 4 x 4 的⽅格,从第⼀个开始遍历,假设遍历顺序是上,右,下,左,那么遍历的顺序如下:

在上⾯的过程图示中,我们可以发现,访问是有顺序的,每遍历⼀个新的⽅块,都会标⼀个顺序,然后按照顺序遍历其四个⽅向。

这也就是⼴度优先搜索的本质,我们需要⼀个队列,来保存遍历的顺序,每次都从队列⾥⾯取出⼀个位置,遍历其四周的⽅块,每次遍历到的点,都会放到队列⾥⾯,这样直到队列为空的时候,也就是全部遍历完成。

import java.util.LinkedList;
import java.util.Queue;

public class Solution13 {
    public int movingCount(int threshold, int rows, int cols) {
        boolean[][] visited = new boolean[rows][cols];
        int count = 0;
        
        Queue<int[]> queue = new LinkedList<>();
        // 把第⼀个点加到队列⾥⾯
        queue.add(new int[]{0, 0});
        
        while (queue.size() > 0) {
            // ⼀直取数据,直到队列为空
            int[] x = queue.poll();
            // 取出来的数据,包含x,y坐标
            int i = x[0], j = x[1];
            // 如果访问过或者不符合,直接下⼀个
            if (i >= rows || j >= cols || threshold < getSum(i) + getSum(j) || visited[i][j]) continue;
            
            // 置为访问过
            visited[i][j] = true;
            // 数量增加
            count++;
            // 右
            queue.add(new int[]{i + 1, j});
            // 下
            queue.add(new int[]{i, j + 1});
       }
       return count;
   }
   
    // 计算位数之和
   private int getSum(int num) {
        int result = 0;
        while (num > 0) {
            result = result + num % 10;
            num = num / 10;
        }
        return result;
    }
}
  • 时间复杂度:最坏的情况是将所有的格⼦都遍历⼀遍, O(m*n) 。
  • 空间复杂度:借助了额外的空间保存是否被访问过,同样为O(m*n) 。

动态规划(最优解)

利用递推关系式,避免重复计算。

  • 格子(i,j)可达 ⇔ 数位和满足条件 ∧ (左边格子可达 ∨ 上边格子可达)
  • dpi表示(i,j)是否可达,基于左边和上边格子的状态:dp[i][j] = (digitSum(i) + digitSum(j) ≤ k) && (dp[i-1][j] || dp[i][j-1])
public class Solution {
    public int movingCount(int m, int n, int k) {
        if (k == 0) return 1;
        
        // dp[i][j]表示格子(i,j)是否可达
        boolean[][] dp = new boolean[m][n];
        dp[0][0] = true;  // 起点可达
        int count = 1;     // 起点已计入
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 跳过起点和数位和超限的情况
                if ((i == 0 && j == 0) || digitSum(i) + digitSum(j) > k) {
                    continue;
                }
                
                // 检查是否可以从左边或上边到达当前格子
                if (i - 1 >= 0) {
                    dp[i][j] |= dp[i - 1][j];  // 从上边来
                }
                if (j - 1 >= 0) {
                    dp[i][j] |= dp[i][j - 1];  // 从左边来
                }
                
                // 如果当前格子可达,计数加1
                count += dp[i][j] ? 1 : 0;
            }
        }
        
        return count;
    }
    
    private int digitSum(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}
  • 时间复杂度:O(mn),双重循环遍历所有格子
  • 空间复杂度:O(mn),dp数组的空间

基于 Gemini 3 的可视化深度多智能体推理引擎

【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!1 【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!2 【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!3

【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!4 【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!5 【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!6 【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!7

【开源】Prisma:基于 Gemini 3 的多专家并行推理架构,支持动态规划。部分效果超越 Gemini DeepThink。免费使用!9
PixPin_2026-01-08_12-42-55 2



求个 star
实验性功能,欢迎测试!


📌 转载信息
原作者:
yeahhe
转载时间:
2026/1/8 18:09:16