力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int tribonacci(int n) {
int a[4]={0,1,1,2};
if(n<4) return a[n];
int k=n-3;
for(int i=0; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int waysToStep(int n) {
vector dp(n+1,1);
if(n==1) return 1;
dp[1]=1;
dp[2]=2;
for(int i=3; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int minCostClimbingStairs(vector& cost) {
int n=cost.size();
vector dp(n,0);
dp[0]=cost[0],dp[1]=cost[1];
for(int i=2; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
//if(n==1) return 1;不一定能解码成功
vector dp(n+1);
//dp[0]=1,dp[1]=1;//s[0]不一定能解码成功
dp[0]=1;
for(int i=1; i1&&s[i-2]!='0')
{
int a=s[i-2]-'0',b=s[i-1]-'0';
if(a*10+b<=26)
dp[i]+=dp[i-2];
}
}
for(auto e:dp)
{
cout<
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int rob(vector& nums) {
int n=nums.size();
vector f(n+1);//偷的dp表
vector g(n+1);//不偷的dp表,f[0],g[0]都是初始化为0
for(int i=1; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int n=0;
int rob(vector& nums) {
//偷了第一个就不能偷最后一个,偷的区间变成了[0,n-2]
//偷了最后一个就不能偷第一个,..............[1,n-1]
n=nums.size();
if(n==1) return nums[0];
return max(r(nums,0,n-2),r(nums,1,n-1));
}
int r(vector& nums, int left, int right)
{
vector f(n);//偷的dp表
vector g(n);//不偷的dp表,f[0],g[0]都是初始化为0
for(int i=1; i
利用左右区间固定的方法,封装性更好
class Solution {
public:
int n=0;
int rob(vector& nums) {
//偷了第一个就不能偷最后一个,偷的区间变成了[0,n-2]
//偷了最后一个就不能偷第一个,..............[1,n-1]
n=nums.size();
if(n==1) return nums[0];
return max(r(nums,0,n-2),r(nums,1,n-1));
}
int r(vector& nums, int left, int right)
{
vector f(n+1);//偷的dp表
vector g(n+1);//不偷的dp表,f[0],g[0]都是初始化为0
// for(int i=1; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public:
int deleteAndEarn(vector& nums) {
//把所有相同的数字映射在对应下标下,并计算他们的和,意思就是删除这个数所获得的这个数的所有存在之和
//把零也作为打家劫舍要处理的部分,因为不值得额外处理
//同样必须把预处理后的数组全部读完
int n=nums.size();
int a[20001]={0};
for(auto e:nums)
{
a[e]+=e;
}
vector f(20002);
vector g(20002);
for(int i=1; i<20002; i++)
{
f[i]=g[i-1]+a[i-1];
g[i]=max(f[i-1],g[i-1]);
}
return max(f[20001],g[20001]);
}
};
优化方法:可以先遍历一遍数组找到最大值,只建立刚好映射最大数字的数组,在数据范围小的时候,这样可以大大减少后续遍历的时间。
class Solution {
public:
int deleteAndEarn(vector& nums) {
//把所有相同的数字映射在对应下标下,并计算他们的和,意思就是删除这个数所获得的这个数的所有存在之和
//把零也作为打家劫舍要处理的部分,因为不值得额外处理
//同样必须把预处理后的数组全部读完
int n=nums.size();
//int a[20001]={0};
int nums_max=0;
for(auto e:nums)
{
nums_max=max(e,nums_max);
}
vector a(nums_max+1);//刚好能够映射max的下标
for(auto e:nums)
{
a[e]+=e;
}
vector f(nums_max+2);
vector g(nums_max+2);
for(int i=1; i
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/JEj789/
class Solution {
public:
int minCost(vector>& costs) {
int n=costs.size();
vector> dp(n+1,vector(3));
for(int i=1; i