一.DP思想步骤
1.确认原问题与子问题
原问题是求n的最优解,子问题是求1,2,n-1的最优解
2.确定状态
第i个状态的最优解
3.确定边界状态的值
例如第1,第2个状态可以直接定义
4.确定状态转移方程
dp[i]由题意和边界状态求得
二.例题
1.爬楼梯
每次可走1阶或2阶楼梯,问n阶有多少种上楼的方式?
int climbStairs(int n){
vector<int> dp(n+3,0);//状态数组
dp[1]=1;
dp[2]=2;//确定边界状态
for(int i=3;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];//状态转移矩阵
}
return dp[n];
}
2.不同路径
有一个m*n的网格,从左上角出发到右下角,每次只能向下或向右移动一格,问有多少不同路径?
int pathSum(int m,int n){
vector<vector<int>> res(m,vector<int>(n,1));
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
res[i][j]=res[i-1][j]+res[i][j-1];//每个位置只可能从上面或左面过来
}
}
return res[m-1][n-1];
}