TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
动态规划 是最优化原理 中的一种重要的方法。 动态规划在查找有很多 重叠子问题 的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。 动态规划只能应用于有 最优子结构 的问题。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决。
总的来说,动态规划的优势在于:
重叠子问题
最优子结构
记忆化
问题描述:
动态规划举例
图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.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 String TRIANGLE_FILE ="c:/java/triangle.txt" ;
-
- public static String[][] getTriangle() {
- String[][] rtn;
- try{
- File f =new File(ReadTriangle.TRIANGLE_FILE);
- BufferedReader br=new BufferedReader(new FileReader(f));
- List l =new Vector();
- String line =br.readLine();
- while (line != null ) {
- l.add(line.trim());
- line=br.readLine();
- }
- int heigth=l.size();
- rtn =new String[heigth][];
- for ( int i =0 ; i< heigth ; i ++ ) {
- String s = (String)l.get(i);
- String[] tk =s.split(" ");
- int tklen =tk.length;
- rtn[i] =new String[tklen];
- for ( int k =0 ; k < tklen ; k ++ ) {
- rtn[i][k] = tk[k];
- }
- }
- return rtn;
- } catch (FileNotFoundException e) {
- System.out.println("err1="+e);
- } catch (IOException e) {
- System.out.println("err2="+e);
- }
- return null ;
- }
- public static void main(String args[]){
- String[][] trn=ReadTriangle.getTriangle();
- System.out.println("toal="+trn.length);
- for(int i=0;i< trn.length;i++){
- System.out.println("ok="+trn[i].length);
- for(int j=0;j< trn[i].length;j++)
- System.out.println(trn[i][j]);
- }
- }
-
- }
复制代码 结果输出如下:
Max Path:[(0,0), (1,0), (2,0), (3,1), (4,1), (5,2)]
Max Value:39
同样的方法可以解决很多类似的问题,比如,游戏中的最短路径;最优化投资问题;背包问题等等.
源码下载:http://file.javaxxz.com/2014/10/28/235738531.zip |
|