dp算法篇Day7

这篇具有很好参考价值的文章主要介绍了dp算法篇Day7。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

dp算法篇Day7,dp动规算法,算法

 "抱紧你的我,比国王富有~"


31、最长定差子序列

(1) 题目解析

dp算法篇Day7,dp动规算法,算法

         从题目来看还是很容易理解的,就是找寻数组中构成差值相等的子序列。

        

(2) 算法原理

dp算法篇Day7,dp动规算法,算法

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        //  {a,dp[i]}
        unordered_map<int,int> hash;   
        hash[arr[0]] = 1;

        int ret = 0;
        for(int i=1; i<arr.size(); ++i)
        {
            // 不存在k hash[arr[i] - difference]==0, 这里也是1
            // 存在k 那么直接+1即可
            hash[arr[i]] = hash[arr[i] - difference] + 1;
            ret = max(ret,hash[arr[i]]);
        }
        return ret;
    }
};

 文章来源地址https://www.toymoban.com/news/detail-568388.html


32、子序列问题_最长斐波那契子序列的长度

(1) 题目解析

 

(2) 算法原理

dp算法篇Day7,dp动规算法,算法

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {
        // hash: {元素,下标}
        unordered_map<int,int> hash;
        for(int i=0; i<arr.size(); ++i)
        {
            hash[arr[i]] = i;
        }

        int n = arr.size();
        vector<vector<int>> dp(n,vector<int>(n,2));
        int ret = 2;
        // 从第二个第三个开始查找
        for(int i=2; i<n; ++i)
        {
            for(int j=1; j<i; ++j)
            {
                int a = arr[i]-arr[j];
                // 比较
                if(a<arr[j] && hash.count(a)) dp[j][i] = dp[hash[a]][j] + 1;
                ret = max(ret,dp[j][i]);
            }
        }
        return ret < 3 ? 0 : ret;
    }
};

 


33、最长等差数列 

(1) 题目解析     

        等差数列?这似乎和我们之前做的一个题类似。但是,那个题是给出了差值,但是这道题却没有。因此,这两道题的解法就很不一样了。

(2) 算法原理

dp算法篇Day7,dp动规算法,算法

class Solution {
public:
    int longestArithSeqLength(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> dp(n,vector<int>(n,2));
        unordered_map<int,int> hash;
        hash[nums[0]] = 0;

        int ret = 2;
        for(int i=1; i<n ;++i) // 固定倒数第二个
        {
            for(int j=i+1; j<n;++j) // 枚举倒数第一个
            {
                int a = 2*nums[i] - nums[j];
                if(hash.count(a)) dp[i][j] = dp[hash[a]][i] + 1;
                ret = max(ret,dp[i][j]);
            } 
            // 更新哈希 {值,下标}
            hash[nums[i]] = i;
        }
        return ret;
    }
};

34、等差数列划分Ⅱ

(1) 题目解析

dp算法篇Day7,dp动规算法,算法

 

(2) 算法原理

        dp算法篇Day7,dp动规算法,算法

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        unordered_map<long long, vector<long long>> hash;
        int n = nums.size();
        for(int i=0; i<n; ++i)
        {
            // 存在重复的 数字 但下标不同
            hash[nums[i]].push_back(i);
        }

        int sum = 0;
        vector<vector<int>> dp(n,vector<int>(n));
        for(int j=2; j<n; ++j) // 固定倒数第一个
        {
            for(int i=1; i<j; ++i)
            {
                // 测试用例会给很大的数
                long long a = (long long)2 * nums[i]-nums[j];
                // 判断在不在
                if(hash.count(a))
                {
                    // 提出下标
                    for(auto k:hash[a])
                    {
                        if(k < i) dp[i][j] += dp[k][i] + 1;   
                    }
                }
                sum += dp[i][j]; 
            }
        } 
        return sum;
    }
};

35、回文字串

(1) 题目解析

dp算法篇Day7,dp动规算法,算法

 

(2) 算法原理

dp算法篇Day7,dp动规算法,算法

class Solution {
public:
    int countSubstrings(string s) {
        int n = s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));

        int ret = 0;
        // dp[i][j] --> s[i,j];
        // 填表顺序 从下往上填 从左往右
        for(int i=n-1; i>=0; --i) // 下往上
        {
            for(int j=i; j<n; ++j) // 左往右
            {
                if(s[i] == s[j])
                    dp[i][j] = i+1 < j ? dp[i+1][j-1]:true;
                
                if(dp[i][j])
                    ret++;
            }
        }
        return ret;
    }
};

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

dp算法篇Day7,dp动规算法,算法

 

到了这里,关于dp算法篇Day7的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法基础复盘笔记Day11【动态规划】—— 区间DP、计数类DP、树形DP、记忆化搜索

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2024年02月01日
    浏览(42)
  • 算法基础复盘笔记Day10【动态规划】—— 线性DP

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月21日
    浏览(83)
  • 【算法训练(day1)】李白打酒加强版(dp问题)

    目录 一.题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.解题思路 定义状态 推导状态方程 细节处理  三.实现代码 四.小结一下 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 22 斗。他边走边唱: 无事街上走,提壶去

    2024年02月02日
    浏览(40)
  • C++ Day7

    C++11中引出了变量的类型自动推导,它和Python 不一样,C++需要用auto来引导 auto修饰变量,可以自动推导出变量的数据类型 1 使用auto修饰变量时,必须初始化 2 auto的右值,可以是右值,也可以是表达式,还可以是函数的返回值 3 auto不能直接声明数组 4 auto不能作为函数的

    2024年02月10日
    浏览(41)
  • c++day7

     仿照vector手动实现自己的myVector,最主要实现二倍扩容功能 思维导图

    2024年02月08日
    浏览(38)
  • gorm day7

    gorm Belongs To关系 gorm Has One关系 gorm Belongs To关系 在看文档之前先进行一些基本概念的学习: 什么是主键?(Primary Key) 主键是一个表中的特定列(或一组列), 用来唯一标识表中的每一行记录。一个表只能有一个主键。 主键的值必须是唯一的,不允许为空(NULL)。 主键通常

    2024年02月20日
    浏览(37)
  • 自学day7 数组

    对象中可以通过键值对存储多个数据,且数据的类型是没有限制的,所以通常会存储一个商品的信息或一个人的信息: 但对象在存储同类型数据的时候比较困难,例如,存储一个班级所以人的姓名: 这种存储方式我们没有办法通过一个人的姓名获取到这个人的编号,也没有

    2024年02月05日
    浏览(40)
  • arm:day7

    1.软中断处理    

    2024年02月12日
    浏览(41)
  • 渗透测试学习day7

    Task1 问题:除了SSH和HTTP,这个盒子上还托管了什么服务? nmap扫一下 Task2

    2024年02月05日
    浏览(41)
  • 蓝桥杯打卡Day7

    文章目录 阶乘的末尾0 整除问题 本题思路: 由于本题需要求阶乘的末尾0,由于我们知道2*5=10可以得到一个0,那么我们就可以找出2的数和5的数,但是由于是阶乘,所以5的数量肯定是小于2的数量,因此我们只需要知道5的数量即可,这里只需要算含有5的次幂的数目即可。  本

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包