DAY41
动态规划理论基础
还差闫氏分析法没学完。见B站收藏夹。
前两题学习初始化方式就好vector<int> dp(N+1);
509斐波那契数
简单。
- class Solution {
- public:
- int fib(int N) {
- if (N <= 1) return N;
- int dp[2];
- dp[0] = 0;
- dp[1] = 1;
- for (int i = 2; i <= N; i++) {
- int sum = dp[0] + dp[1];
- dp[0] = dp[1];
- dp[1] = sum;
- }
- return dp[1];
- }
- };
70爬楼梯
简单。
- class Solution {
- public:
- int climbStairs(int n) {
- if (n <= 1) return n;
- int dp[3];
- dp[1] = 1;
- dp[2] = 2;
- for (int i = 3; i <= n; i++) {
- int sum = dp[1] + dp[2];
- dp[1] = dp[2];
- dp[2] = sum;
- }
- return dp[2];
- }
- };
746使用最小花费爬楼梯
不会做了,实在想不出来。
代码随想录官方解答:
现在会了。主要是状态转移的形式,学一下:
- class Solution {
- public:
- int minCostClimbingStairs(vector<int>& cost) {
- if(cost.size()==2) return min(cost[0],cost[1]);
- vector<int> dp(cost.size()+1);
- dp[0]=0,dp[1]=0;
- for(int i=2;i<dp.size();i++){
- dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
- }
- return dp[dp.size()-1];
- }
- };
54螺旋矩阵
厦大保研夏令营考过,练一练。
终于过了,卡在记录该位置是否已经走过,用unordered_set, unordered_map显然都不行。想复杂了,用二维数组bool就好了。
- class Solution {
- public:
- vector<int> spiralOrder(vector<vector<int>>& matrix) {
- vector<int> res;
- int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
- vector<vector<bool>> flag(matrix.size(),vector<bool>(matrix[0].size(),false));
- int size=matrix.size()*matrix[0].size();
- for(int x=0,y=0,d=0,k=1;k<=size;k++){
- flag[x][y]=true;
- res.push_back(matrix[x][y]);
- int a=x+dx[d],b=y+dy[d];
- if(a<0||a>=matrix.size()||b<0||b>=matrix[0].size()||flag[a][b]){
- d=(d+1)%4;
- a=x+dx[d],b=y+dy[d];
- }
- x=a,y=b;
- }
- return res;
- }
- };
59螺旋矩阵ii
厦大保研夏令营考过,练一练。ACWING语法基础课做过,再写一遍:
还是写不出来,不知道该怎么利用偏移量去更新。
加油吧:
- class Solution {
- public:
- vector<vector<int>> generateMatrix(int n) {
- int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
- vector<vector<int>> res(n,vector<int>(n,0));
- int mi=n*n;
- for(int x=0,y=0,d=0,k=1;k<=mi;k++){
- res[x][y]=k;
- int a=x+dx[d],b=y+dy[d];
- //撞墙或者走过了,不要漏了“走过”
- if(a<0||a>n-1||b<0||b>n-1||res[a][b]){
- d=(d+1)%4;
- a=x+dx[d],b=y+dy[d];
- }
- x=a,y=b;
- }
- return res;
- }
- };