动态规划:数字三角形
来源:互联网 发布:ubuntu 虚拟机 wifi 编辑:程序博客网 时间:2024/04/30 13:18
////Number Triangles (出处:IOI '94)//// 如下所示为一个数字三角形://// 7// 3 8// 8 1 0// 2 7 4 4// 4 5 2 6 5//// 请编一个程序计算从顶至底的某处的一条路径,使该路径经过的数字总和最大。////>每一步可沿直线向下或右斜线向下走////>1<行数<=100////>三角形中的数字为整数0..99////【分析】////首先把路线倒过来,即从下往上,直到第一行的数字。////对于一个数字(数字I),到达它的最优路线的最后一步可以是上或左上。不妨假设最后一步是上,那么到达下方数字(数字II)的路径也必须最优。可以 用“剪贴”方法证明这一点:如果到达数字II的路径非最优,那么可以改进路径使数字II的路径更优,这样到达数字I的路径还可以更优,与原先假设数字I路 线已经最优矛盾。所以到达数字II的路径必为最优。////有了最优子结构,我们可以很方便地得出状态转移方程:////f[i,j]=max{f[i+1,j],f[i+1,j+1]}+a[i,j]////初始值:f[n,j]=a[n,j](n为行数)目标值:f[1,1]#include<stdio.h>int Tri[5][5]={{7}, {3,8}, {8,1,0}, {2,7,4,4}, {4,5,2,6,5}};int dayn(int a[5][5], int m){int i,j;for (i=m-2; i>=0; i--)//3->0{for (j=0; j<i+1; j++) // 0->i{printf("%d %d %d --> ", Tri[i][j],Tri[i+1][j], Tri[i+1][j+1] );int t=((Tri[i+1][j]>Tri[i+1][j+1])? Tri[i+1][j] :Tri[i+1][j+1]);printf("%dth choose %d --> ", i, t);Tri[i][j] += t ;printf("%d %d %d \n", Tri[i][j],Tri[i+1][j], Tri[i+1][j+1] );}printf("\n");}///int nn=Tri[0][0];return nn;}int main(){printf("%d\n",dayn(Tri,5));return 0;}
参考:http://hi.baidu.com/vizdsaauwcbfhnd/item/8193390957092011acdc7047
结果:
如果是求最小路径:
- 动态规划----数字三角形
- 数字三角形 动态规划
- 动态规划:数字三角形
- 动态规划--数字三角形
- 动态规划--数字三角形
- 动态规划-数字三角形
- 数字三角形--动态规划
- 动态规划&数字三角形
- 动态规划 数字三角形
- 动态规划 数字三角形
- 动态规划:数字三角形
- 动态规划 数字三角形
- 动态规划-数字三角形
- 动态规划:数字三角形
- 数字三角形--动态规划
- 动态规划--数字三角形
- 动态规划-数字三角形
- 数字三角形 动态规划
- 很完整的2、8、10、16进制转换方法的进制的转化
- Color depth
- symantec NBU with status 59: access to the client was not allowed
- ABAP SCREEN 常用语句
- flash player 安装报错不是最新版本问题解决
- 动态规划:数字三角形
- jstl标签和EL表达式
- linux下错误bad interpreter: No such file or directory
- SSH xml配置文件及架构设计
- [linux安全] nmap扫描器的使用
- 主流linux版本介绍
- 事物
- 浅谈c# Attribute
- Eclipse 优化