- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA动态规划
动态规划 是 最优化原理 中的一种重要的方法。
动态规划在查找有很多 重叠子问题 的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有 最优子结构 的问题。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决。 总的来说,动态规划的优势在于:
重叠子问题 最优子结构 记忆化
问题描述: 动态规划举例 图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思路: 1.算出每个节点的规划值 也就是待比较的最大值 ,并记录搜索路径 2.取三角形底边所有规划值中的最大值 3.输出路径 主程序
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 0j 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][
文档评论(0)