动态规划是最优化原理中的一种重要的方法。
动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决。
总的来说,动态规划的优势在于:
问题描述:
动态规划举例
图10-3(a)示出了一个数字三角形,请编一个程序,
计算从顶至底的某处的一条路劲,
使该路劲所经过的数字的总和最大。
(1) 每一步可沿左斜线向下或右斜线向下;
(2) 1<三角形行数≤100;
(3) 三角形中的数字为0,1,……99。
输入数据:
由INPUT.TXT文件中首先读到的是三角形的行数,
在例子中INPUT.TXT表示如图13-3(b).
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
5 6 9 5 9 8
从别人blog里看到这个题目,手上痒痒,就写了一个.用的是逆向递推法从顶部往下.
分2个文件,一个主程序和一个用于读取文件的辅助类.
思路:
1.算出每个节点的规划值(也就是待比较的最大值),并记录搜索路径
2.取三角形底边所有规划值中的最大值
3.输出路径
主程序
package
test;
import
java.util.
*
;
/** */
/**
* 用动态规划法求出最优路径
*
@author
zqc
*
*/
public
class
DynamicSolveTrianglePath
{
private
String[][] str_triangle
=
null
;
private
Node[][] triangle_nodes
=
null
;
private
List nodes;
private
List paths;
//
节点
static
class
Node
{
private
int
value;
private
List path
=
new
Vector();
public
List getPath()
{
return
path;
}
public
void
setPath(List p)
{
path
=
p;
}
//
n=(0,0) or (0,1) or (2,2)
public
void
addPath(String n)
{
path.add(n);
}
public
void
addPath(List pa)
{
path.addAll(pa);
}
public
int
getValue()
{
return
value;
}
public
void
setValue(
int
value)
{
this
.value
=
value;
}
}
public
DynamicSolveTrianglePath()
{
initNodes();
findPath();
}
// 从根节点开始,逆向推解出到达所有节点的最佳路径
private void initNodes(){
this.str_triangle = ReadTriangle.getTriangle();
triangle_nodes = new Node[str_triangle.length][];
nodes = new Vector();
for(int i = 0 ; i < str_triangle.length; i++){
triangle_nodes[i] = new Node[str_triangle[i].length];
for(int j = 0 ; j<str_triangle[i].length;j++){
String currentPath = "("+i+","+j+")";
Node n = new Node();
if(i==0&&j==0){
n.setValue(
c(str_triangle[0][0])
);
n.addPath(currentPath);
triangle_nodes[i][j] = n;
continue;
}
//左右边界节点
if((j==0||j==str_triangle[i].length-1)){
if(i==1){//第2行的节点
int value = c(str_triangle[0][0])+c(str_triangle[i][j]);
List ph = triangle_nodes[0][0].getPath();
n.addPath(ph);
n.addPath(currentPath);
n.setValue(value);
ph = null;
}else{//0,1行以下的其他边界节点
int value = j==0?c(str_triangle[i][j])+triangle_nodes[i-1][j].getValue():
c(str_triangle[i][j])+triangle_nodes[i-1][j-1].getValue();
List ph = j==0?triangle_nodes[i-1][j].getPath():
triangle_nodes[i-1][j-1].getPath();
n.addPath(ph);
n.addPath(currentPath);
n.setValue(value);
}
}else{//除边界节点外其他节点
Node node1 = triangle_nodes[i-1][j-1];
Node node2 = triangle_nodes[i-1][j];
Node bigger = max(node1,node2);
List ph = bigger.getPath();
n.addPath(ph);
n.addPath(currentPath);
int val = bigger.getValue()+c(str_triangle[i][j]);
n.setValue(val);
}
triangle_nodes[i][j] = n;
n = null;
}//end of for j
}//end of for i
}
private Node max(Node node1,Node node2){
int i1 = node1.getValue();
int i2 = node2.getValue();
return i1>i2?node1:node2;
}
private int c(String s){
return Integer.parseInt(s);
}
//找出最佳路径
private void findPath(){
if(this.triangle_nodes==null)return;
int max = 0;
int mi = 0;
int mj = 0;
for(int i = 0 ; i < triangle_nodes.length; i++){
for(int j = 0 ; j<triangle_nodes[i].length;j++){
int t = triangle_nodes[i][j].getValue();
if(t>max){
max = t;
mi = i;
mj = j;
}
}
}
System.out.println("Max Path:"+triangle_nodes[mi][mj].getPath());
System.out.println("Max Value:"+max);
}
public static void main(String[] args)throws Exception{
DynamicSolveTrianglePath dsp = new
DynamicSolveTrianglePath();
}
}
用于读取文件的辅助类
package
test;
import
java.io.
*
;
import
java.util.
*
;
/** */
/**
* 输入文本格式为
* 类似这样一个数字三角形
*
* x
* x x
* x x x
* x x x x
* x x x x x
*
*
@author
zqc
*
*/
public
class
ReadTriangle
{
public
static
分享到:
相关推荐
2. 动态规划:动态规划是解决问题的优化方法,通过记录已经解决的问题,避免了重复劳动,找到了最优解。小灰了解了动态规划的思想和实现方法,学会了使用动态规划来解决实际问题。 3. 贪心算法:贪心算法是解决问题...
当问题满足以下条件时,通常考虑使用动态规划: - 要求的是一个问题的最优解,如最大值或最小值。 - 问题可以被分解为若干个子问题。 - 子问题之间存在重叠,即一个子问题可能会被多次用到。 3. **如何使用动态...
"五大常用算法之二:动态规划算法" 动态规划算法是五大常用算法之一,属于多阶段决策问题的解决方法。该算法的核心思想是将问题分解为多个阶段,每个阶段都有其对应的状态和决策,以便通过决策序列来达成最优解。 ...
动态规划是一种重要的算法,主要应用于解决最优化问题,尤其在计算机科学和数学中广泛应用。它通过将复杂问题分解成一系列子问题,然后逐步构建最优解。动态规划算法的关键在于利用子问题的最优解来构建原问题的最优...
本篇文章将深入探讨标题和描述中提到的一些核心算法,包括动态规划、分治算法、概率算法、模拟退火算法、搜索算法、贪婪算法、在线MATLAB应用、遗传算法以及组合算法。 1. **动态规划**:动态规划是一种解决具有...
2. 贪心算法从上往下,从顶部一步一步最优,得到最后的结果,而动态规划和分治法是从下到上,逐步找到全局最优解。 3. 贪心算法不能保证全局最优解,因为它只考虑局部最优解,而不考虑整体的影响,而动态规划和分治...
动态规划算法经典题目分析 动态规划是一种非常经典的算法思想,解决的问题领域非常广泛。动态规划的基本思想是将一个复杂的问题分解成多个小问题,通过解决这些小问题来解决整个问题。今天,我们将要探讨动态规划的...
2. 空间复杂度:动态规划算法的空间复杂度大于其他算法 3.算法效率:动态规划算法的效率取决于问题的规模和子问题的数目 动态规划算法是一种解决多阶段决策问题的优化方法,通过将问题broken down into smaller sub...
模型算法大全:规划模型(19份),供大家学习参考: 课件:最短路问题.ppt LINGO线性规划及其灵敏度分析.doc ... 动态规划+多目标规划(2份) 1.动态规划.ppt 2.多目标.ppt 整数规划.docx 线性规划.docx
动态规划的讲义。十分有用。 用了之后收获很大。 推荐各位研究算法的同学
动态规划算法课件PPT 动态规划算法是解决问题的有效方法,它将问题分解成多个子问题,然后通过解决这些子问题来解决原问题。动态规划算法与分治法类似,但不同的是,动态规划算法中子问题之间存在相互依赖关系,...
**算法动态规划专题** 动态规划(Dynamic Programming,简称DP)是一种在计算机科学中解决最优化问题的算法技术,尤其在解决复杂度较高的多阶段决策问题时表现得尤为出色。它通过将大问题分解为小问题,并存储子...
《算法设计与分析》课程笔记代码Part2(动态规划+贪心算法+回溯算法) 本文为博主基于课堂ppt以及自行编写的代码整理的研究生《算法设计与分析》课程笔记,涉及分治算法、动态规划算法、贪心算法、回溯算法、分支...
2. `global_planner`:实现A*算法的全局路径规划。 3. `local_planner`:使用DWA进行局部路径规划和避障。 4. `move_base`:整合全局和局部规划器,处理速度控制等。 通过阅读和理解这些代码,你可以学习如何在实际...
动态规划:全局最优解,但需要记录前面的结果防止重复计算;分治法:将原问题划分成子问题,递归地解决子问题,然后合并结果。 2. 贪心算法:从上往下,从顶部一步步最优;动态规划:从下到上,一步一步找到全局最...
### 贪心算法与动态规划 #### 一、贪心算法 **1.1 贪心法的基本思想** 贪心算法是一种简单直观的方法,它通过一系列的局部最优选择来构建全局最优解。贪心法的基本思路是从问题的一个初始解出发,逐步逼近给定的...
1. **动态规划**(Dynamic Programming, DP):动态规划是一种通过将复杂问题分解为更小的子问题来求解的方法。它在解决最优化问题时非常有效,如背包问题、最长公共子序列、旅行商问题等。动态规划的核心思想是...
"动态规划算法的应用" 动态规划算法是一种非常强大且广泛应用的算法思想,它可以解决许多复杂的问题。动态规划算法的核心思想是将问题分解成小问题,然后使用Memoization技术将中间结果存储起来,以便后续问题的...
2. 子问题重叠:动态规划算法利用了子问题被重复计算的现象。通过保存子问题的解,避免了重复计算,极大地提高了效率。例如,在矩阵链乘法中,多次计算相同大小的矩阵乘积会导致大量重复工作,动态规划通过记忆化...