dp算法训练(未完)


第N个斐波那契数列dp算法训练(未完)_第1张图片

力扣(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

三步问题

dp算法训练(未完)_第2张图片

力扣(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

最小花费爬楼梯

dp算法训练(未完)_第3张图片

力扣(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



解码的方法

dp算法训练(未完)_第4张图片

dp算法训练(未完)_第5张图片 

力扣(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<

打家劫舍

dp算法训练(未完)_第6张图片

力扣(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

打家劫舍||

dp算法训练(未完)_第7张图片

 力扣(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

删除并获得点数

dp算法训练(未完)_第8张图片

力扣(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

粉刷房子

dp算法训练(未完)_第9张图片

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://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

你可能感兴趣的:(算法练习,算法,leetcode,c++,算法)