前言
动态规划(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:
输入: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+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。