leadcode的Hot100系列--62. 不同路径--简单的动态规划

题目比较清晰,简单来说就是:

A B C D
E F G H
I J K L

只能往右或者往下,从A到L,能有几种走法。
这里使用动态规划的方法来做一下。
动态规划最重要的就是动态方程,这里简单说下这个动态方程怎么做出来的吧。



记 f(B) 为 A到B总共可以有的走法。
想知道f(L),那其实只要知道f(H)和f(K)就可以了。
因为从A到H之后,再想到L就只有一种方法,AK同理,所以 f(L) = f(H) + f(K)。

那f(H)呢,就等于 f(D)+f(G),这里就很容易得到他的动态方程:

f [i] [j] = f [i] [j-1] + f [i-1] [j] // i 代表行,j 代表列

得到状态方程之后,最后再考虑一下边界的情况,也就是 f(A) f(B) f(E) f(I) 等。
因为题目已经规定了,只能往右走,或者往下走,
所以第一行的走法都是只有1,第一列的走法也是只有1,可以得到:

1 1 1 1
1 f(F) f(G) f(H)
1 f(J) f(K) f( L)

so:f(F) = f(B) + f(E) = 1 + 1 = 2
f(G) = f(C) + f(F) = 1 + 2 = 3
f(H) = f(D) + f(G) = 1 + 3 = 4
f(J) = f(I) + f(F) = 1 + 2 = 3
f(K) = f(G) + f(J) = 3 + 3 = 6
f(L) = f(H) + f(K) = 4 + 6 = 10

这里附上代码:

int uniquePaths(int m, int n){
    int dp[100][100]={0}, i, j;
    for (i=0; i<m; i++)     // 这里初始化第一列的走法为1
        dp[i][0] = 1;
    for (i=0; i<n; i++)   // 这里初始化第一行的走法为1
        dp[0][i] = 1;

    for (i=1; i<m; i++)
    {
        for (j=1; j<n; j++)
        {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];   // 动态方程
        }
    }

    return dp[m-1][n-1];

}

原文地址:https://www.cnblogs.com/payapa/p/11161223.html

时间: 2024-11-05 15:50:58

leadcode的Hot100系列--62. 不同路径--简单的动态规划的相关文章

leadcode的Hot100系列--136. 只出现一次的数字

因为之前刚写了461号题目,这个题目与那个很相似, 461号题目用异或来算两个不一样的部分, 那这个题目需要排除一样的部分,并找到不一样的部分. 那么可以再利用一下异或的特性: 1.相同为0,所以,a ^ a = 0. 2.不同为0,所以,0 ^ b = b. 所以,假设数组里面的数分别就是 a,a,b, ---> a ^ a ^ b = b,那么b就是要找的那个不一样的数字. (异或的最终结果与异或的顺序无关,即 a ^ b ^ c = a ^ c ^ b = b ^ c ^ a ). 附上代

leadcode的Hot100系列--461. 汉明距离

求两个数的二进制位不同的位置,最先想到的就是异或操作, 异或:按位运算,相同为0,不同为1. 比如: a = 6 对应的二进制表示为: 0 0 1 1 1 ? b = 9 对应的二进制表示为: 0 1 0 0 1 则 a ^ b = 14 对应的二进制表示为: 0 1 1 1 0 所以,只要算出异或之后的数的二进制表示方法里面1的个数. 比如,对于上面的异或之后为14,14的二进制里面1的个数为3,那么汉明距离就是3. 想知道是否有1,最快的当然还是位与操作, 与:按位运算,相当于乘法,0与0是

leadcode的Hot100系列--617. 合并二叉树

合并,就是两个树的结构交集部分,数据相加,否则,取非空部分. 所以,这里相当于是对两棵树同时遍历: 如果两棵树节点都不为空,则数据相加, 否则,直接指针把不为空的节点复制过来. 注:这里没有申请内存,而直接对原有的树进行改造,这样可以节省申请内存的时间,且节省一些内存. struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2){ struct TreeNode *pTemp = NULL; if ((NULL ==

leadcode的Hot100系列--226. 翻转二叉树

这玩意儿基本上还是遍历的那一套, 这里使用先序遍历的方式,直接对左右子树进行对调即可. (虽然看题目的时候,感觉都一样,但真正写出来之后,印象还是深刻了很多) struct TreeNode* invertTree(struct TreeNode* root){ struct TreeNode *pTemp = NULL; if (NULL == root) return NULL; pTemp = root->left; root->left = root->right; root-&

leadcode的Hot100系列--155. 最小栈

栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 pop, 对应出电梯,把数据往外拿 栈顶,对应电梯门口 栈底,对应电梯最深处 这里使用链表实现栈. 先创建一个MinStack头, 入栈:直接把结构体挂在MinStack头后面, 出栈:直接拿出MinStack头后面的结构体. 取最小值:对链表进行一次遍历,返回最小值. typedef struct m

[Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Rails开发环境配置 [Ruby on Rails系列]3.初试Rails:使用Rails开发第一个Web程序 [Ruby on Rails系列]4.专题:Rails应用的国际化[i18n] [Ruby on Rails系列]5.专题:Talk About SaSS [1]任务目标 本次主要是要实现一

[leetcode] 62. 不同路径

62. 不同路径 我们直接用递归来模拟 class Solution { public static int cnt; public int uniquePaths(int m, int n) { cnt = 0; dfs(1, 1, m, n); return cnt; } public void dfs(int i, int j, int m, int n) { if (i == m && j == n) { cnt++; return; } if ((j + 1) <= n)

51系列小型操作系统精髓 简单实现8 C语言版待改进

使用keil4  ,代码Code Optimization:0   运行OK 可运行8个任务 Program Size: data=21.0 xdata=0 code=401  (包括2个示例变量,未优化) 任务从中断处切换,在定时时间到后从定时中断中切换回来. 待改进地方 1.手动优化汇编程序 2. 重入问题 3.参数进函数和时中断的保护问题 #include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T

51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d