不同路径—动态规划

思路:第一行和第一列的元素都有一条路径可以到达,将对应位置赋值为1。接下来每个位置处都可以从其上边或左边到达。

 1 int uniquePaths(int m, int n) {
 2         // write your code here
 3         int ** s = new int*[m];
 4         for (int i = 0; i < m; i++) {
 5             s[i] = new int[n];
 6         }
 7         for (int i = 0; i < m; i++) {
 8             s[i][0] = 1;
 9         }
10         for (int i = 0; i < n; i++) {
11             s[0][i] = 1;
12         }
13         for (int i = 1; i < m; i++) {
14             for (int j = 1; j < n; j++) {
15                 s[i][j] = s[i-1][j] + s[i][j-1];
16             }
17         }
18         return s[m-1][n-1];
19     }

思路:第一行和第一列在没有遇到障碍时,都有一条路径可以到达,都设为1。但当第一行(列)某个位置遇到障碍时,该位置处和其右边(下边)位置处都不能到达了,都要设为0。接下来的位置,当遇到障碍时设为0,没有障碍时还是其上边的路径加上左边的路径。

 1 int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {
 2         // write your code here
 3         int row = obstacleGrid.size();
 4         int col = obstacleGrid[0].size();
 5         int ** s = new int*[row];
 6         for (int i = 0; i < row; i++) {
 7             s[i] = new int[col];
 8         }
 9         int t = 0, flag = 0;
10         for (int i = 0; i < row; i++) {
11             if (obstacleGrid[i][0] == 0) {
12                 s[i][0] = 1;
13             } else {
14                 s[i][0] = 0;
15                 t = i;
16                 flag = 1;
17                 break;
18             }
19         }
20         if (flag == 1) {
21             for (int i = t; i < row; i++) {
22                 s[i][0] = 0;
23             }
24             flag = 0;
25         }
26
27         for (int j = 0; j < col; j++) {
28             if (obstacleGrid[0][j] == 0) {
29                 s[0][j] = 1;
30             } else {
31                 s[0][j] = 0;
32                 t = j;
33                 flag = 1;
34                 break;
35             }
36         }
37         if (flag == 1) {
38             for (int j = t; j < col; j++) {
39                 s[0][j] = 0;
40             }
41             flag = 1;
42         }
43         for (int i = 1; i < row; i++) {
44             for (int j = 1; j < col; j++) {
45                 if (obstacleGrid[i][j] == 0) {
46                     s[i][j] = s[i-1][j] + s[i][j-1];
47                 } else {
48                     s[i][j] = 0;
49                 }
50             }
51         }
52         return s[row-1][col-1];
53     }
时间: 2024-10-12 12:06:34

不同路径—动态规划的相关文章

不同路径--动态规划

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步. 机器人试图达到网格的右下角(在下图中标记为“Finish”) 问总共有多少条不同的路径? 说明: m和n 的值均不超过100 示例1: 输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角. 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右

63. Unique Paths II(有障碍的路径 动态规划)

Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle and empty space is marked as 1 and 0 respectively in the grid. For example, There is one obstacle in the middl

LeetCode -- Triangle 路径求最小和( 动态规划问题)

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

动态规划---从左上角到右下角的价值最大的路径

编程题:动态规划---从左上角到右下角的价值最大的路径 腾讯2016年4月2号暑假实习移动开发岗的笔试题,编程题第一题大概题目是: 一个m*n的矩阵,只能向右走或是向下走,矩阵每一个元素代表一个财富值,要求打印出从左上角到右下角走的财富最大总值. 如输入m=4 ,n=5, 输入矩阵value= { 0 0 7 0 0, 0 0 0 5 0, 2 0 4 0 0, 0 0 0 3 0}, 打印出最大财富总值是15. 这是动态规划的题目,跟"[leetcode 64] Minimum Path Su

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

小乐乐要下山(脑残动态规划记录路径)

哈尔滨理工大学OJ上的题目,水是很水,结果我做了好久,发现题中要循环输入,我也是醉了. 题目很简单但是心里不平衡决定发一下. Description 上学的路总是那么艰辛,在小乐乐辛苦的出了家门之后,她才想起自己的家已经搬到山上了(睡的真迷糊).下山的路同样十分艰难,不同的地方通行的难易程度也不同.如图所示,小乐乐现在在山顶上,她面前有两条路,每条路通往一个地点,每个地点有一个值,表示这个通行的难易程度.最底层的地点就是山脚了.大家知道,小乐乐好懒好懒的,她想知道怎么下山最省力? Input 第

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

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

UniquePaths,UniquePaths2,路径问题。动态规划。

UniquePaths:给定m*n矩阵,从(0,0)到(m-1,n-1)路径条数.只能向下向右走. 算法分析:这和爬楼梯问题很像,到(m,n)的路径数是到(m-1,n)和(m,n-1)路径和.第一行,第一列,为边界条件. public class UniquePaths { //动态规划,非递归 public int uniquePaths(int m, int n) { int[][] a = new int[m][n]; for(int i = 0; i < m; i ++)//初始条件,第

FatMouse&#39;s Speed hdu 1160(动态规划,最长上升子序列+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:现给出老鼠的体重与速度,要求你找出符合要求的最长子序列.       要求是 W[m[1]] < W[m[2]] < ... < W[m[n]](体重) && S[m[1]] > S[m[2]] > ... > S[m[n]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合