常见动态规划题 原理及Java实现
动态规划的求解过程:
(1) 划分子问题:将原问题划分为若干子问题,每个子问题对应一个决策阶段,并子问题之间有重叠关系。
(2) 确定动态规划函数:根据子问题之间重叠关系找到子问题满足的递推关系式。
(3) 填写表格:以自底向上的方式计算各个子问题的解并填表,实现动态规划。
上述过程可求出问题的最优值,但要求出具体的最优解,通常还需要在动态规划过程中记录必要信息,再根据最优决策序列构造最优解。
eg.1
数塔问题


动态规划函数:
maxAdd[n-1][j] = d[n-1][j] (0<=j<=n-1)
maxAdd[i][j] = d[i][j] +max{maxAdd[i+1][j],maxAdd[i+1][j+1]}
( 0<=i<=n-2, 0<=j<=i )
伪代码:

java实现
package DynamicProgramming;
public class DataTower {
static int Dt(int[][] d,int n) {
int[][] maxAdd = new int[n][n];
int[][] path = new int[n][n];
int i,j;
for(j=0;j<n;j++) {
//初始化底层决策结果
maxAdd[n-1][j] = d[n-1][j];
}
for(i=n-2;i>=0;i--) { //进行第i层决策
for(j=0;j<=i;j++) { //填写maxAdd[i][j],只填写下三角
if(maxAdd[i+1][j]>maxAdd[i+1][j+1]) {
maxAdd[i][j] = d[i][j] + maxAdd[i+1][j];
path[i][j] = j;
}
else {
maxAdd[i][j] = d[i][j] + maxAdd[i+1][j+1];
path[i][j] = j+1;
}
}
}
System.out.println("path:"+d[0][0]);
j = path[0][0];
for(i=1;i<n;i++) {
System.out.println(d[i][j]);
j = path[i][j];
}
return maxAdd[0][0];
}
public static void main(String[] args) {
int[][] d = new int[][] {{8,0,0,0,0},
{12,15,0,0,0},
{3,9,6,0,0},
{8,10,5,12,0},
{16,4,18,10,9}};
System.out.println(Dt(d,5));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律