刚学习的最长不递增子序列的新求法

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

P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

在做这题的时候学到的

我看说是复杂度在O(nlogn)的算法才能通过这题

普通的办法就不行了(之前写过)

然后我去看题解,学了这种新的方法

网址如下:题解 P1020 【[NOIP1999 普及组] 导弹拦截】 - 古明地觉世界第一! - 洛谷博客 (luogu.com.cn)

然后自己写了下面的这个代码:

#include<stdio.h>
#include<ctype.h>
void scanf_line(void);
int dic(int l, int u, int hi);
int dp[10], f[10], num[10];
int len, maxn = 1;

int main(void)
{
    //输入
    scanf_line();
    //求最长不递增子序列
    f[1] = num[1];
    for(int i = 2; i <= len; i++)
    {
        //二分法求fx最逼近hi时的x,更新dp以及f,maxn
        dp[i] = dic(1, maxn, num[i]) + 1;
        f[dp[i]] = num[i];
        maxn = (maxn > dp[i]) ? maxn : dp[i];
    }
    //输出
    printf("%d", maxn);

    return 0;
}
void scanf_line(void)
{
    int ext = 0;
    for(char c; (c = getchar()) != '\n'; )
        if(isdigit(c))
            ext = ext * 10 + c - '0';
        else
            num[++len] = ext, ext = 0;
    num[++len] = ext;
    return;
}
int dic(int l, int u, int hi)
{
    //初始时的意外情况
    if(f[l] <= hi)  return 0;
    if(f[u] >= hi)  return u;
    //正常结束的情况
    if(u - l <= 1)  return l;

    int mid = (l + u) / 2;
    if(f[mid] < hi)  return dic(l, mid, hi);
    else if(f[mid] > hi)  return dic(mid, u, hi);
    else  return mid;
}

这个代码只求了最大不递增子序列的数量

为的是做上面那道题做准备

而第二位看题解是有两个方法

最多的方法就是利用Dliworth定理做的

等做完再水一篇文吧

看题解用C++的STL做的非常简洁,最近在学C++,准备“升级”了,晚上又看了MCTS,感觉脑子要炸掉

白天去练习了科三,简单来说就是感觉要寄了

最近事有点多啊。。。文章来源地址https://www.toymoban.com/news/detail-815668.html

到了这里,关于刚学习的最长不递增子序列的新求法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 动态规划9:最长递增子序列、最长连续递增序列、最长重复子数组、最长公共子序列、不相交的线、最长子序和

    例题300: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 确定dp数组和下标含义 dp[i]表示在第i个元素的最长子序列数

    2024年04月08日
    浏览(43)
  • 算法刷题Day 52 最长递增子序列+最长连续递增子序列+最长重复子数组

    我自己想出来的方法,时间复杂度应该是 O(n2) 滑动窗口 连续的话,可以考虑用滑动窗口 动态规划 贪心算法

    2024年02月14日
    浏览(54)
  • LeetCode | C++ 动态规划——300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

    300题目链接 dp 数组定义 dp[i] 表示 i 之前包括 i 的以 nums[i]结尾 的最长递增子序列的长度 需要包含nums[i]结尾,不然在做递增比较的时候,就没有意义了。 递推公式 位置 i 的最长递增子序列 等于 j 从 0 到 i - 1各个位置的最长递增子序列 + 1 的 最大值 if (nums[i] nums[j]) dp[i] = ma

    2024年02月16日
    浏览(47)
  • 力扣300. 最长递增子序列

    思路: 假设 dp[i] 为前 i 个元素构成的最长递增子序列的个数,包含 nums[i]; 则 dp[i] 构成序列上一个元素 nums[j] 构成最长递增子序列 dp[j],则 dp[i] = dp[j] + 1; 如果动态取 j ∈ [0, i - 1],则选取其中最长递增子序列值中最大的,其值 + 1 来更新 dp[i] 的值;

    2024年02月04日
    浏览(41)
  • 57 最长递增子序列

    给你一个整数数组 nums ,找到其中 最长严格递增子序列的长度 。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入: nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列

    2024年02月07日
    浏览(39)
  • 300. 最长递增子序列

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如, [3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 2500 -104 = nums[i] = 104

    2024年02月09日
    浏览(42)
  • 最长递增子序列——力扣300

    2024年02月12日
    浏览(34)
  • 673. 最长递增子序列的个数

    673. 最长递增子序列的个数 https://leetcode.cn/problems/number-of-longest-increasing-subsequence/description/

    2024年02月11日
    浏览(34)
  • 【Leecode】674. 最长连续递增序列

    Given an unsorted array of integers nums , return the length of the longest continuous increasing subsequence (i.e. subarray). The subsequence must be strictly increasing. A continuous increasing subsequence is defined by two indices l and r (l r) such that it is [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] and for each l = i r , nums[i] nums[i + 1] . E

    2024年02月07日
    浏览(46)
  • 动态规划之最长递增子序列

    leetcode 300 最长递增子序列 1.定义dp数组:dp[i]表示以nums[i]结尾的最长递增子序列的长度。 2.定义递推公式 dp[i] = max(dp[j] + 1, dp[i]) 因为dp[j] + 1中的dp[j]并非是在前一个已经加1的dp[j]的基础之上再加上1。若从初始状态加1,而dp[i]永远保持的是最大的状态,则dp[j] + 1肯定要小一些。

    2024年01月23日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包