最优路径问题

package 数阵中的最优路径;

import java.util.Scanner;

public class Main {

    /**
     * 数值三角形中的最大路径
     * 随机产生一个n行的点数值三角形(第k行有k个点,每个点都带有一个正整数,)寻找从顶点开始每一步可沿着左或者右向下的至底部的一条路径,
     * 使得该路径的和最大。
     *
     * 数值三角形中的最大路径的搜索
     * 应用动态规划,采用逆推法从低向上逐行反推
     * 随机产生的点数值三角形存储在一个二维数组中,同时赋值给b(n,n),这里的数组b(i,j)为点(i,j)到底的最大的数值和
     * stm(i,j)表示向左还是向右的路标字符数组,实施逆推法,知道b(i,j),stm(i,j)的值由b的第i+1行的值决定:
     *
     * 如果b(i+1,j+1) > b(i+1,j)则
     * b(i,j) = b(i,j)+b(i+1,j+1)
     * stm(i,j) = "R"
     *
     *
     * 如果b(i+1,j+1) <= b(i+1,j)则
     * b(i,j) = b(i,j)+b(i+1,j);
     * stm(i,j) = "L"
     *
     * 这样一直到最后所得的b(1,1)就是所求的最优路径的数值和。
     * 为了打印最优路径,利用stm数组从上到下查找:先打印a(1,1),如果stm(1,1) = “R”
     * 则打印下一个a(2,2)否则打印a(2,1),一般的对i=2,3,4,.....n;
     * 如果stm(i-1,j) = "R",则打印"-R-",a(i,j+1);同时赋值j = j+1;
     * 如果stm(i-1,j) = "L"则打印"-L-" ;a(i,j)
     *
     * @param args
     */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("输入行数:");
        int n = input.nextInt();
        int i,j,t;
        int a[][] = new int[100][100];
        int b[][] = new int[100][100];
        char[][]stm = new char[100][100];
        //打印数字三角形
        for(i = 1;i<=n;i++)
        {
            for(j = 1;j<=40-2*i;j++)
            {
                System.out.printf("  ");
            }

            for(j = 1;j<=i;j++)
            {
                a[i][j] = (int)(Math.random()*20+1);
                b[i][j] = a[i][j];
                System.out.printf("%4d",a[i][j]);
            }
            System.out.println();
        }

        //逆推求最大值
        for(i = n-1;i>=1;i--)

            for(j = 1;j<=i;j++)
            {
                if(b[i+1][j+1] > b[i+1][j])
                {
                    b[i][j]+=b[i+1][j+1];
                    stm[i][j]=‘R‘;
                }else{
                    b[i][j]+=b[i+1][j];
                    stm[i][j] = ‘L‘;
                }
            }

        System.out.println("最优路径数值和:="+b[1][1]);
        System.out.print("最优路径为:"+a[1][1]);
        //按照路标引号输出最优路径
        j = 1;
        for(i = 2;i<=n;i++)
        {
            if(stm[i-1][j] == ‘R‘)
            {
                System.out.printf("-R-%2d",a[i][j+1]);
                j = j+1;
            }else{
                System.out.printf("-L-%2d",a[i][j]);
            }
        }

    }

}
时间: 2024-12-16 10:11:24

最优路径问题的相关文章

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

路网最优路径算法总结

前段时间,关于路网最优路径算法的专题我做了一次内部分享,感兴趣的朋友可以进行查看与下载,     链接如下: http://files.cnblogs.com/files/gisorange/%E8%B7%AF%E7%BD%91%E6%9C%80%E4%BC%98%E8%B7%AF%E5%BE%84%E7%AE%97%E6%B3%95%E6%A6%82%E8%BF%B0-2015-9-22.pdf

Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一.实际数据 已知图中所有节点的X.Y坐标. J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二.Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function [ optimal,path,maxnum ] = Floyd( distance,liantong,num,p,q ) 2 %Author:ljy 3 %Date:20170919 4

路网最优路径算法之一分层搜索

1 背景 前面介绍了关于双向及启发式的搜索,它们均可以实现了效率的倍增.但是应用到长距离(例如武汉——杭州大于500公里)的搜索时,平均效率存在100ms级甚至s级的耗时,显然这样一个面对广大用户群的互联网服务引擎效率是不可接受的,那么有没有优化的方向可以实现数量级的提升?      但人类对效率与正确的极致追求也是不止境的.关于双向及启发式搜索,它们的优化初衷均是一致的:缩短搜索范围.有人想到另一个路网搜索优化的方向:稀疏搜索路网密度——分层算法. 2 分层算法 假设有个长距离路径搜索的cas

3、动态规划问题中的最优路径保存与输出

在动态规划问题中,我们经常会遇到以下问题,最优解倒是求出来了,但是最优解的路径呢?如何输出?这确实是一个问题,而且往往比较难哟.. 我这里说的路径是指,像在钢条切割问题中,从哪些地方切可以达到最优化,在矩阵链乘问题中,从哪些地方进行组合可以使效率最高? 在钢条切割问题中: for(j=1;j<=i; j++){ if(priceStore[i-j]+ironPrice[j-1]>price){ pathStore[i]=j; //意思为使是长度为i的钢条价格达到最优,需要从第j个位置进行截断,

隐马尔可夫模型模型评估及最优路径的matlab实现

自己根据算法编写了两个简单的matlab代码,应用于例子中的数据取得了正确的解,这里并没有考虑速度优化的问题,请大家不吝指教: 1.模型评估 HMM模型如下,试根据前向算法计算产生观察符号序列O={ABAB}的概率. 状态转移概率矩阵 a = [0.4 0.6 0 ; 0   0.8 0.2; 0   0    1 ]; 观测矩阵: o= [0.7 0.3 0.7 0.3; 0.4 0.6 0.4 0.6; 0.8 0.2 0.8 0.2]; 初始概率矩阵: pi = [1 0 0]; 例题中的

递归,搜索,回溯,最优路径(线段)

基本信息 内存:520kB 时间:0ms 语言:G++ 题目链接http://bailian.openjudge.cn/practice/solution/4779752/ 解题报告: 1.输入表格时,由于这里有空格,不能用scanf函数. 2.gets(board[i]+1) 不要把第一列刷去. 3.回溯mark[y][x]=false;这里在Search玩后,一定要将mark[y][x]改为false.否则下一次的搜索将不会访问到这个点. 4.方向最好用数组形式表示. 5.最重要的一点是:这

ArcEngine 地图导航 查找路径 经纬度坐标导航 最优路径分析

本文来自CSDN博客,转载请标明出处 http//blog.csdn.net/zdb330906531 需求:根据经纬度坐标,取得两个起点与终点,显示最优路径实现导航. 参考官方例子后,我在arcMap上已实现效果,要求改为代码实现. 实现思路:1.创建路径 2.添加位置 3.求解 代码如下: ①    创建路径 public INAContext CreateSolverContext(INetworkDataset networkDataset) { IDENetworkDataset de

【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status][Discuss] Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站. 地图由点和双向边构成,每个点代表一个路口,也有可