矩阵中的最小路径

package 数阵中的最优路径;

import java.util.Scanner;

public class Main2 {

    /**
     * 数阵中的最小路径搜索
     * 1:设计要点
     * 应用动态规划设计从右下角逐行至左上角,确定n,m后,随机产生的整数二维数组a(n,m)作矩阵输出同时赋值给部分和数组b(n,m).
     * 数组b(i,j)为点(i,j)到到右下角的最小数值和stm(i,j)是点(i,j)向右(R)或向下(D)或向右下(0)的路标数组
     * 注意到最后一行与最后一列各数只有一个出口,于是b[n][m]开始向左逐个推出同行的b[n][j](j=m-1,.....1);想上逐个推出同列
     * b(i,m)(i = n-1,......1);
     * b(i,j)与stm(i,j)的值,由同一列下面的值b(i+1,j),与同一行右边的值b(i,j+1),其右下方的值b(i+1,j+1)值决定。
     * 设min = min(b(i+1,j+1),b(i+1,j),b(i,j+1))
     * 首先作赋值min=b(i+1,j+1),stm(i,j) = "0"
     * 如果b(i,j+1)<min,则min=b(i,j+1);stm(i,j) = "R"
     * 如果b(i+1,j)<min,则min=b(i+1,j);stm(i,j) = "D"
     * 然后赋值b(i,j) = b(i,j)+min.
     *
     *
     *
     *
     *
     * @param args
     */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("输入行数:");
        int n = input.nextInt();
        System.out.println("输入列数:");
        int m = input.nextInt();

        int a[][] = new int[30][30];
        int b[][] = new int[30][30];
        char[][]stm = new char[30][30];

        //输出矩阵
        for(int i=1;i<=n;i++)
        {
            for(int j = 1;j<=m;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(int j = m-1;j>=1;j--)//第n行递推为边界条件
        {
            b[n][j]+=b[n][j+1];
            stm[n][j]=‘R‘;
        }

        for(int i = n-1;i>=1;i--)//第m列递推为边界条件
        {
            b[i][m]+=b[i+1][m];
            stm[i][m]=‘D‘;
        }

        //逆推求取最小值
        for(int i=n-1;i>=1;i--)
            for(int j = m-1;j>=1;j--)
            {
                int min = b[i+1][j+1];
                stm[i][j] = ‘0‘;
                if(min > b[i+1][j])
                {
                    min = b[i+1][j];
                    stm[i][j]=‘D‘;
                }

                if(min > b[i][j+1])
                {
                    min = b[i][j+1];
                    stm[i][j] = ‘R‘;
                }
                b[i][j]+=min;
            }

        System.out.println(b[1][1]);

    }

}
时间: 2024-10-28 16:33:16

矩阵中的最小路径的相关文章

LA 3126 二分匹配---DAG中的最小路径应用

题意:有 n 个顾客 , 需要坐出租车从一个地方去另一个地方 , 每个顾客的出发时间.出发地点.目的地点都已给出 , 从出发地点到目的地点的时间为两地之间的路径长度 , 并且出租车要比顾客的出发时间早一分钟到达 , 问最少需要派出多少辆出租车. 解法:我们先这样来构图 , 每个顾客是一个结点,如果同一个出租车在接完客人 u 之后还来得及节客人 v , 那么就在 u 到 v 之间连一条有向边 . 由此可以发现 , 这个图是一个DAG , 那么我们就只需要找最小路径覆盖(最小路径覆盖:是指在图中找尽

每日算法之四十四:Unique Path(矩阵中不重复路径的数目)

Unique Paths: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked

矩阵的最小路径和二维动态规划的空间压缩

题目:给定一个矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有的数字累加起来作为这条路径的路劲和.要求返回所有路径和中的最小路径和. 举例: 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回其和12. 解析: 这个题目很类似之前的那个动态规划的数字三角的问题.毫无疑问的,这个问题也是用动态规划解决.只要确定了状态和转移方程,这个题目很容易解决.下面直接给出代码: //利用path记录路径,对于每一个path[i][j],0代表dp[i][j]的值从上

66 - 矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 例如在下面的 3*4 的矩阵中包含一条字符串"bcced"的路径.但矩阵中不包含字符串"abcb"的路径,因为字符串的第一个字符 b 占据了矩阵中的第一行第二格子之后,路径不能再次进入这个格子. a b c e s f c s a d e e 回溯

回溯法 矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子. 这是一个可以用回溯法解决的经典题.首先,在矩阵中任选一个格子作为路径的起点.假设矩阵中某个格子的字符为ch,并且这个格子将对应于路径上的第i个字符.如果路径上的第i个字符不是ch,那么这个格子不可能处在路径上的第i个位置.如果路径上的第i个字符正好是ch,那么到相邻的格子寻找路

POWOJ 1739: 魔术球问题 DAG最小路径覆盖转最大流

1739: 魔术球问题 题意: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.对于给定的n,计算在n根柱子上最多能放多少个球. tags: 对大佬来说应该是很素的一道题,但某还是花了好多时间才做出来.. 一开始连建图都有点懵,然后最小路径还是新概念,最大匹配也不太懂,最大流倒是会一点. 然后要打印答案,也不

(hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)

题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 124 Accepted Submission(s): 102   Problem Description Consider a town where all the streets are one-way and each street leads from one

(hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把所有的顶点都覆盖)

题目: Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 124 Accepted Submission(s): 102   Problem Description Consider a town where all the streets are one-way and each street leads from one

POJ-3020 Antenna Placement---二分图匹配&amp;最小路径覆盖&amp;建图

题目链接: https://vjudge.net/problem/POJ-3020 题目大意: 一个n*m的方阵 一个雷达可覆盖两个*,一个*可与四周的一个*被覆盖,一个*可被多个雷达覆盖问至少需要多少雷达能把所有的*覆盖 解题思路: 把每个*城市编号,然后每相邻两个城市之间连线.这里求最少多少个雷达可以覆盖完*,就是二分图匹配中的最小路径覆盖数,但是这里的图的边是双向的.举个例子 o*o **o ooo 这里可以编号成 010 230 000 那么有边<1,3><3,1><