《五月集训》第二十八天——动态规划


前言

        动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

💎一、题目一

🏆1.题目描述

原题链接:70. 爬楼梯

        假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
        每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1 .1 阶 + 1 阶
2 .2 阶

🏆2.解题思路

🔑思路:

​         爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。
第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来。

🏆3.代码详解

int f[46] = {0};
int climbStairs(int n){
    if(n <= 1) return 1;

    if(f[n] == 0){          //不为零代表这个值求过了
        f[n] = climbStairs(n-1)+climbStairs(n-2);
    }
    return f[n];
}

💎二、题目二

🏆1.题目描述

原题链接:53. 最大子数组和

        给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
        子数组 是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

🏆2.解题思路

🔑思路:

​         因为是连续子数组,对数组第一个值向后叠加,同时判断当前和的大小始终保持最大,如果数组当前值大于前面叠加和时就进行置换,取当前值。

🏆3.代码详解

#define max(a, b) ((a)>(b)?(a):(b))
int maxSubArray(int* nums, int numsSize){
    int ansmax = nums[0], pre = 0;
    for(int i = 0; i < numsSize; ++i){
        pre = max(pre+nums[i], nums[i]);
        ansmax = max(ansmax, pre);
    }
    return ansmax;
}

💎三、题目三

🏆1.题目描述

原题链接:1706. 球会落何处

        用一个大小为 m x n 的二维网格 grid 表示一个箱子。你有 n 颗球。箱子的顶部和底部都是开着的。
箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。

  • 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。
  • 将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。

在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。如果球恰好卡在两块挡板之间的 “V” 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。
返回一个大小为 n 的数组 answer ,其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标,如果球卡在盒子里,则返回 -1 。

示例 1:
Alt
输入:grid = [[1,1,1,-1,-1],[1,1,1,-1,-1],[-1,-1,-1,1,1],[1,1,1,1,-1],[-1,-1,-1,-1,-1]]
输出:[1,-1,-1,-1,-1]
解释:示例如图:
b0 球开始放在第 0 列上,最终从箱子底部第 1 列掉出。
b1 球开始放在第 1 列上,会卡在第 2、3 列和第 1 行之间的 “V” 形里。
b2 球开始放在第 2 列上,会卡在第 2、3 列和第 0 行之间的 “V” 形里。
b3 球开始放在第 3 列上,会卡在第 2、3 列和第 0 行之间的 “V” 形里。
b4 球开始放在第 4 列上,会卡在第 2、3 列和第 1 行之间的 “V” 形里。

🏆2.解题思路

🔑思路:

​        对每一个球的轨迹,进行深搜判断是否能从底部掉出来并记录状态。每一次for循环是对一个球的轨迹判断。

🏆3.代码详解

void dfs(int** grid, int gridSize, int* gridColSize, int* ans, int idx, int row, int col){
    int nextcol;

    if(row >= gridSize){
        ans[idx] = col;
        return;
    }
    if(col == 0 && grid[row][col] == -1){
        ans[idx] = -1;
        return;
    }
    if(col == gridColSize[0]-1 && grid[row][col] == 1){
        ans[idx] = -1;
        return;
    }
    if(grid[row][col] == 1){
        if(grid[row][col+1] == -1){
            ans[idx] = -1;
            return;
        }
        nextcol = col+1;
    }
    if(grid[row][col] == -1){
        if(grid[row][col-1] == 1){
            ans[idx] = -1;
            return;
        }
        nextcol = col-1;
    }
    dfs(grid, gridSize, gridColSize, ans, idx, ++row, nextcol);

}
int* findBall(int** grid, int gridSize, int* gridColSize, int* returnSize){
    * returnSize = gridColSize[0];
    int* ans = (int*)malloc(sizeof(int)*gridColSize[0]);
    for(int i = 0; i < gridColSize[0]; ++i){
        dfs(grid, gridSize, gridColSize, ans, i, 0, i);
    }
    return ans;
}

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到490+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值