力扣070.爬楼梯
class Solution {
public:
int climbStairs(int n) {
if(n == 1){
return 1;}
if(n == 2){
return 2;}
int a = 1, b = 2, temp;
for(int i = 3; i <= n; i++){
temp = a;
a = b;
b = temp + b;
}
return b;
}
};
求具体路径:
#include <bits/stdc++.h>
using namespace std;
int cnt = 0;
vector<string> ans;
void dfs(int n, int cur, string s) {
if (cur == n) {
cnt++;
ans.push_back(s);
return;
}
if (cur > n)
return;
dfs(n, cur + 1, s + to_string(cur + 1));
dfs(n, cur + 2, s + to_string(cur + 2));
}
int main() {
int n;
cin >> n;
dfs(n, 0, "0");
cout << cnt << endl;
for (auto& s : ans) {
cout << s << endl;
}
}
扩展:不能爬到7及7的倍数
dp[i]=dp[i-1]+dp[i-2] (i-1、i-2都不是7 的倍数)
dp[i]=dp[i-1] (i-2是7的倍数)
dp[i]=dp[i-2] (i-1是7的倍数)
dp[i]=0 (都是7的倍数)
力扣062.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
class Solution {
public:
int uniquePaths(int m, int n) {
int arr[m][n];
// 第0列 和 第0行为边界 全为1
for(int i=0;i<m;i++){
arr[i][0]=1;}
for(int i=0;i<n;i++){
arr[0][i]=1;}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
// 动态规划表达式
arr[i][j] = arr[i-1][j] + arr[i][j-1];
}
}
return arr[m-1][n-1];
};
作者:wang-xiao-shuai-ve
链接:https://leetcode-cn.com/problems/unique-paths/solution/bu-tong-lu-jing-dong-tai-gui-hua-yu-shu-xue-by-wan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> dp(n);
for (int i = 0; i < n; i++) dp[i] = 1;
for (int j = 1; j < m; j++) {
for (int i = 1; i < n; i++) {
dp[i] += dp[i - 1];
}
}
return dp[n - 1];
}
};
作者:carlsun-2
链接:https://leetcode-cn.com/problems/unique-paths/solution/62-bu-tong-lu-jing-shen-sou-dong-gui-shu-n7d1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
力扣064.最小路径和(状态压缩后)
第一行:
dp[i] = grid[0][i] + dp[i - 1];
设想我们从第二行开始,每一行的每一个点都可以由上边的点向下移动经过。
对于第i行第j列的点(i > 1)逐行遍历至该点时,有两种情况
(1)对于每行的第一个点只有他上边的点向下移动才可以经过该点
(2)剩下的点都可以由他上边的点向下移动或左边的点向右移动到达
对于第一类点,我们遍历到新一行时,由于该点只能由其他点向下移动到达我们就可以根据前一行的dp[0]来更新该点的决策值
dp[0] += grid[i][0]
对于第二类点,我们可以得到如下等式
dp[j] = grid[i][j] + min(dp[j-1],dp[j])
等式右边dp[j]代表当前点上一行对应位置点的决策收益值
dp[j-1]代表当前位置左侧点的决策收益值。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int rows = grid.