首页 > 其他分享 >国庆homework

国庆homework

时间:2024-10-07 20:23:18浏览次数:7  
标签:en envelopes int ++ 国庆 homework 数组 dp

1最长递增序列
简单来说就是从一串数字李找出连续的最长递增序列,暴力的思路就是通过两次循环,第一层是便利每个元素,第二层便利第一层之前的元素,如果当前元素大于前一个元素,并且以j结尾的递增子序列长度加1大于dp[i],则更新
普通

点击查看代码

    int n;
    cin >> n;
    int max1 = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (a[i] > a[j] && dp[j] + 1 > dp[i])
            {
                dp[i] = dp[j] + 1;
            }
        }
        max1 = max(max1, dp[i]);
    }
    cout << max1+1;
    return 0;
}
2 二分 这个时间复杂度是n*logn,通过upper——bound(找到第一个大于等于他的数)和lower-bound(找到第一个大于他的数),每次便利的时候找有没有大于他的数,如果有,则将当前数替代第一个大于他的数,如果没有,就插入到最后,最后的数组长度就是答案
点击查看代码
  int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int m = 1;
    for (int i = 0; i < n; i++)
    {
        int p = lower_bound(en, en + m, a[i]) - en;
        if (p >= m)
        {
            en[m] = a[i];
            m++;
        }
        else
        {
            en[p] = a[i];
        }
    }
    cout << m - 1;
3 二维递增(变形,俄罗斯套娃)

算是个二位模板,代码理解差不多

点击查看代码
  int n = envelopes.size();
        int m = envelopes[0].size();
        sort(envelopes.begin(), envelopes.end(), [](auto a, auto b)
             {
            if (a[0] == b[0]) return a[1] > b[1];
            return a[0] < b[0]; });
    int q=0;
        for (int i = 0; i < n; i++)
        {
            int p = envelopes[i][1];
            int o = lower_bound(f, f+q, p)-f;
            if(o==q){
               f[q++]=p;;
            }
            else{
                f[o]=p;
            }
        }
    
    return q;
最长数队链

这题不同的是是一个二维数组【x,y】且前一个y要小于后一个x,关键的是里面end数组的更新,其实end数组存的是每个数组的y,每次将新数组的x与里面存入的y进行比较,如果没有比x大的,说明当前数组的x和y都是最大的,直接存到最后面,否则,就要将比x大的第一个位置的y与当前的y进行比较,然后挑选较小的数,因为要的是最长的链,前面的数越小越利于后面的数加入

点击查看代码
int n=pairs.size();
        int m=pairs[0].size();
        int y=0;
        sort(pairs.begin(),pairs.end());
        for(int i=0;i<n;i++){
            int p=pairs[i][0];
            int o=pairs[i][1];
            int u=lower_bound(f,f+y,p)-f;
            if(u==y){
            
                f[y++]=o;
                
            }
            else{
                f[u]=min(f[u],o);
             }
        }
        return y;
最后,为什么不下降只需要修改二分,我的理解是,其实每个这种题目原理都差不多,都是通过建立一个数组,然后通过lower和upperbound找第一个大于(等于)当前的数进行数组的更新,并且该方法的时间和空间都要优于dp

标签:en,envelopes,int,++,国庆,homework,数组,dp
From: https://www.cnblogs.com/tzstlove/p/18439747

相关文章

  • 雅礼国庆集训 day1 T2 折射
    题面题面下载算法转化题意说白了就是给了你一堆点,让你数这种折线有多少个(严格向下走,并且横坐标之间的差越来越小)看着像一种在y轴方向排序的dp但是由于是折线,所以需要加一维来判断转向dp设计状态设计\(dp_{i,0/1}\)表示第i个点,是向左下还是右上状态转移......
  • 雅礼国庆集训 day1 T1 养花
    题面题目下载算法考虑当\(k\)确定的时候如何求答案,显然对于所有形如\([ak,(a+1)k)\)的值域区间,最大值一定是最优的似乎怎么都是\(O(n^2)\)的算法观察到\(a_i\)的值域比较小,所以考虑桶显然对于一段区间\([L,R]\)我们可以推出其\(modk\)的最大值方法......
  • 国庆期间不停歇—学习ROS2第四天
    1.现在终端中创建文件其次在该文件目录下打开,最后在VS中创建两个文件夹,最后一个是src在终端中创建pkg,  ros2pkgcreatedemo_python_topic--build-typeament_python--dependenciesrclpyexample_interfaces--licenseApache-2.0ros2中创建功能包包的名字demo_py......
  • Living-Dream 系列笔记 第80期(国庆集训合集)
    IDDFS使用场景:搜索树非常大而答案的深度较浅,一般在\(20\)以内,且dfs会TLE,bfs会MLE。算法原理:以dfs的形式搜索;设定搜索的深度限制\(dep\);dfs深度不能超过\(dep\),且要恰好遍历所有\(dep\)的状态;若在\(dep\)层没有找到答案,\(dep+1\todep\),重新DFS......
  • 国庆集训 Day 5
    国庆集训Day52024年10月5日Status:CLOSED中间咕了。。\(\def\EZ{\textcolor{#51af44}{\text{EZ}}}\EZ\)表示简单,10分钟内就能想到。\(\def\HD{\textcolor{#3173b3}{\text{HD}}}\HD\)表示中等,能独立想出\(\def\IN{\textcolor{#be2d23}{\text{IN}}}\IN\)表示困难......
  • 国庆集训 Day 4
    国庆集训Day42024年10月4日Status:CLOSED中间咕了。。\(\def\EZ{\textcolor{#51af44}{\text{EZ}}}\EZ\)表示简单,10分钟内就能想到。\(\def\HD{\textcolor{#3173b3}{\text{HD}}}\HD\)表示中等,能独立想出\(\def\IN{\textcolor{#be2d23}{\text{IN}}}\IN\)表示困难......
  • 国庆题目
    MaximizetheLargestComponent(HardVersion)题意:给定一个\(n\timesm\)的网格,由“.”和“#”字符组成。如果从该组中的任何单元格开始,通过仅移动到该组中共享一个共同边的另一个单元格,就可以到达该组中的任何其他单元格,则一组“#”单元格形成一个连通分量。其大小为该......
  • 【训练记录】2024年莆田市高中信息学奥赛国庆集训CSP-S提高组(第四天场外)
    训练情况rk#1\(100+100+100+100=400\)赛后反思因为满分AK了,就不需要反思了A题显然我们想要选的最多,我们优先选\(a_i\)小的,所以我们对\(a_i\)从小到大排序,再求一个前缀和,再使用二分即可#include<bits/stdc++.h>#defineintlonglongusingnamespaces......
  • 【牛客训练记录】2024牛客国庆集训派对day3
    赛后反思还是只开出来一题TATH题构造一个01矩阵,想要横竖斜三个数都不同,好像方法有很多,我们考虑交错着放010101011010101001010101上面这种长度为\(1\)的01显然不行,因为斜着也算,所以我们考虑构造长度为\(2\)的01,例如00111100这样001100111100110000110011110......
  • 国庆 CF 做题记录
    CF2002F2考虑F1,当\(n=m\)时,我们默认\(l\gef\)。此时我们可以发现一个比较正确的策略:先从\((0,0)\)跳到满足\(p\)是质数的\((p,0)\)处,然后再跳到满足\(q\)是小于\(p\)的质数的\((p,q)\)处,然后再暴力BFS。不会证明,可以达标找出这样的结论。当\(n>m\)时,注......