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

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]; }

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

  1. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  2. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  3. leadcode的Hot100系列--二叉树创建和遍历

    很多题目涉及到二叉树,所以先把二叉树的一些基本的创建和遍历写一下,方便之后的本地代码调试. 为了方便,这里使用的数据为char类型数值,初始化数据使用一个数组. 因为这些东西比较简单,这里就不做过多详 ...

  4. leadcode的Hot100系列--78. 子集--回溯

    上一篇说了使用位运算来进行子集输出,这里使用回溯的方法来进行排序. 回溯的思想,我的理解就是: 把解的所有情况转换为树或者图,然后用深度优先的原则来对所有的情况进行遍历解析. 当然,因为问题中会包涵这 ...

  5. leadcode的Hot100系列--78. 子集--位运算

    看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...

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

    栈:先入后出,后入先出 像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口, 所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来. push,对应入电梯,把数据往里面压 po ...

  7. leadcode的Hot100系列--206. 反转链表

    这里使用两种方式, 一个是直接从头往后遍历 -------> 迭代 一个是从最后一个往前遍历 -----> 递归 迭代 定义三个变量:pPre pNext pNow pPre表示当前节点的 ...

  8. leadcode的Hot100系列--104. 二叉树的最大深度

    依然使用递归思想. 思路: 1.树的深度 = max (左子树深度,右子树深度)+ 1 . ------> 这里的加1是表示自己节点深度为1. 2.如果当前节点为null,则说明它的左右子树深度 ...

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

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

随机推荐

  1. abp框架(aspnetboilerplate)设置前端报错显示

    abp在后端抛出异常 throw new UserFriendlyException($"抛出一个错误"); 在发布之前,需要设置是否把报错发送给前端 如果将此设置为true,则会 ...

  2. KEIL MDK编译后的代码量和RAM使用详解

    一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘.编译器会将一个程序分为好几个部分,分别存储在 MCU 不同的存储区.Keil 工程在编译完 ...

  3. qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

    最近抽空又看了下qt,发现用它来实现一些东西真的很容易比如下面这个例子,绘制了个圆形的时钟,但代码却清晰易懂[例子源自奇趣科技提供的例子]因为清晰,所以就只写注释了,吼吼其实也就这么几行代码头文件 / ...

  4. WPF 鼠标在图片Image上悬停时切换更改设置图片源Source

    // 无效的写法,图片不会被切换 <Image Margin="0,0,0,0" Width="50" Height="50" Sou ...

  5. 安装CUDA和cuDNN

    GPU和CPU区别 1,CPU主要用于处理通用逻辑,以及各种中断事物 2,GPU主要用于计算密集型程序,可并行运作: NVIDIA 的 GeForce 显示卡系列采用 GPU 特性进行快速计算,渲染电 ...

  6. 微信小程序把玩(十四)button组件

    原文:微信小程序把玩(十四)button组件 button按钮用的算是最普遍的组件之一. 主要属性: wxml <!--按钮默认样式,点击事件--> <button type=&qu ...

  7. 零元学Expression Blend 4 - Chapter 30 8个Expression Blend4的快捷

    原文:零元学Expression Blend 4 - Chapter 30 8个Expression Blend4的快捷 我针对工作区跟视窗的快捷键整理了八个Expression Blend4的快捷, ...

  8. CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)

            所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...

  9. C++中代理类和句柄类

    指针是 C 与其他语言区别的重要特征之一,在 C++ 中,指针也被广泛运用,我们通过指针实现多态.然而,众所周知,指针的使用必须小心,否则很容易造成内存泄漏 Memory Leak.当我们有几个指针指 ...

  10. 用shell做简单的分布式计算

    # 分布式计算小试 # .首先获取本机host,作为实际计算时分区hash的种子 # .以*.*.*.44为主节点,*.*.*.///43为从节点 hash=`cat /root/data/host. ...