如何确定动态规划的转移方程
Posted VR技术学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定动态规划的转移方程相关的知识,希望对你有一定的参考价值。
我流浪般的赤着双脚走来,
深感途程上顽石棱角的坚硬.
再加上那一丛丛拦路的荆棘,
使我每一步都留下一道血痕.
——食指:《热爱生命》1978
开篇点题
-
先观察最后一个状态
比如 LintCode 114 ,题意是从一个二维数组的左上角走到右下角共有多少种不同的路径.且每次只能向下或者向右走一步,最后一个状态就是右下角
2. 观察到达最后一个状态的前面的所有状态,它只能从该位置的上面或者右边过来,故前两个状态就是上面和右边的位置.
3. 写出动态转移方程: f[i][j] = f[i-1][j] + f[i][j-1],其中f[i][j]代表走到位置的所有情况种数.
4. 你没看错,那就是状态转移方程.
5. 之后确定边界条件,什么叫边界条件?
6. 比如左上角没有右边和上边,所以 f[0][0] = 1
第一列和第一行只有一种到达的方式,横着走或竖着走,依次+1即可
7. 反过来从 f[0][0]开始使用状态转移方程计算就可以了,比如f[1][1] = f[0][1] +f[1][0]
代码见下:
class Solution {
public:
int f[110][110];
int solve(int m,int n){
for(int i=0;i<m;++i) f[i][0]=1;
for(int i=0;i<n;++i) f[0][i]=1;
for(int i=1;i<m;++i){
for(int j=1;j<n;++j){
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
}
/**
* @param m: positive integer (1 <= m <= 100)
* @param n: positive integer (1 <= n <= 100)
* @return: An integer
*/
int uniquePaths(int m, int n) {
// write your code here
memset(f,0,sizeof(f));
solve(m,n);
return f[m-1][n-1];
}
};
状态在动态规划中的作用属于定海神针
简单地说,解决动态规划的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么
类似于解数学题中,X,Y,Z代表什么
那么依赖什么来确定状态呢?
最后一步
子问题
so.什么是最后一步?
以上是关于如何确定动态规划的转移方程的主要内容,如果未能解决你的问题,请参考以下文章