动态规划类型题
简单类型的DP:fibonacci递推、背包、LIS最长递增序列、LCS最长公共子序列
区间DP:括号匹配、回文串
树形DP:选出权重和最大的节点
走格子----棋盘类的DP
例题:机器人在一个m*n的棋盘上左上角,需要移动到棋盘的右下角,但是只能向下和向右移动,请问有多少条路径可以达到右下角的位置?
动态规划的核心思想是将大问题拆解为小问题
-----**大问题拆分:**棋盘问题可以理解为:走到终点的路径等于走到终点左方位置的路径加上走到终点上方的位置的路径之和
所以可以推导得到状态转移方程
dp(m,n) = dp(m-1,n) + dp(m,n-1)
----**边界情况分析:**当机器人在源点时,此时dp(0,0)=0,
dp(0,y)表示棋盘第一行,只能一直往右走。dp(0,x)=1
dp(x,0)表示第一列,只能一直往下走,所以dp(x,0)=1
具体思路:三个for循环
//初始化一个数组
function sumPath(m,n) {
//var arr[m][n]; //注意JS中只支持一维数组,二维数组需要利用一维数组来实现。
//棋盘的第一列
/* for(let i=0; i<m;i++){
arr[i][0]=1;
}
//棋盘的第一行
for(let j=0; j<n;i++){
arr[0][j]=1;
}*/
//棋盘的状态转移方程循环
var arr=[];
for(let i=0; i<m;i++){
arr[i]=[];
for(let j=0;j<n;j++){
if(i==0||j==0) {
arr[i]