您的位置:首页 > 健康 > 养生 > 2024.8.23 刷题总结

2024.8.23 刷题总结

2024/10/6 18:29:20 来源:https://blog.csdn.net/TheJustice_/article/details/141469936  浏览:    关键词:2024.8.23 刷题总结

2024.8.23

**每日一题**

198.打家劫舍,这道题是一道简单的入门动态规划问题,根据题目意思,我们不能取数组中相邻的元素然后还必须满足总结果最大,所以我们可以维护一个数组,用来保存在数组每个位置之前能取到的最大值,然后最后输出第n-1个元素的值即为答案。

转移公式如下:

 dp[i]=max(dp[i-2]+nums[i],dp[i-1]);

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n==1) return nums[0];vector<int> dp(n,0);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i = 2;i<n;i++){dp[i]=max(dp[i-2]+nums[i],dp[i-1]);}return dp[n-1];}
};

279.完全平方数,这道题考察的是动态规划的知识,依题意得,我们需要找到最少的平方数之和使得等于要求的数,我们首先会想到用离该数最近的完全平方数来考虑,但是这样不方便枚举和遍历,所以我们采用动态规划的一般方法,先处理前面的数,再遍历到后面的数。本题需要维护一个到当前位置需要最少完全平方数的数组,然后开始从1遍历到n,这期间需要枚举所有小于i的完全平方数用来找到最小的答案,每次循环起点将dp[i]设置为i,因为这是最多的情况,然后依次比较取最小值,转移方程如下:

 dp[i]=min(dp[i],dp[i-j*j]+1);

class Solution {
public:int numSquares(int n) {vector<int> dp(n+1,0);dp[0]=0;dp[1]=1;for(int i = 2;i<=n;i++){dp[i]=i;for(int j =1;j*j<=i;j++){dp[i]=min(dp[i],dp[i-j*j]+1);}}return dp[n];  }
};

 322.零钱兑换,这道题是考察动态规划的知识,本题也是仿照一般的动态规划的状态转移的思想来完成。首先我们需要维护一个数组表示达到每个金额需要的最少硬币数目,然后遍历求值,第一个状态为金额,从1遍历到n,第二个状态是用的硬币种类,从0遍历到数组末尾,如果当前金额一直低于硬币面额就继续,否则就更新当前所需数目最小值,最后输出所需金额的数目:

 dp[i]=min(dp[i],dp[i-coins[j]]+1);

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount+1,amount+1);dp[0]=0;int n = coins.size();for(int i = 0;i<=amount;i++){for(int j = 0;j<n;j++){if(i-coins[j]<0) continue;dp[i]=min(dp[i],dp[i-coins[j]]+1);}}return (dp[amount]==amount+1) ? -1 : dp[amount]; }
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com