• 蓝桥杯打卡Day11



    文章目录

    • 最长上升子序列
    • 最长上升子序列II


    一、最长上升子序列IO链接

    本题思路:本题是一关于dp问题中的一个类型是最长上升子序列问题,首先我们将状态表示出来:f[i]表示以a[i]结尾的最大的上升序列。状态计算(集合划分):j∈(0,1,2,..,i-1),a[i]>a[j],f[i] = max(f[i], f[j] + 1)。最后在找f[i]的最大值。

    1. #pragma G++ optimize("Ofast,no-stack-protector");
    2. #include
    3. using namespace std;
    4. #define ios() ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    5. #define rep1(i,a,n) for(int i=a;i
    6. #define rep2(i,a,n) for(int i=a;i<=n;i++)
    7. #define rep3(j,b,m) for(int j=b;j
    8. #define rep4(j,b,m) for(int j=b;j<=m;j++)
    9. typedef long long LL;
    10. inline int read(){
    11. int x=0,f=1;
    12. char c=getchar();
    13. while(c<'0'||c>'9'){
    14. if(c=='-')f=-1;
    15. c=getchar();
    16. }
    17. while(c<='9'&&c>='0'){
    18. x=(x<<1)+(x<<3)+(c^48);
    19. c=getchar();
    20. }
    21. return x*f;
    22. }
    23. void print(int x){
    24. if(x<0)putchar('-'),x=-x;
    25. if(x>9)print(x/10);
    26. putchar(x%10^48);
    27. }
    28. constexpr int N=1010;
    29. int n;
    30. int a[N];
    31. int f[N];
    32. int main()
    33. {
    34. ios();
    35. n=read();
    36. rep2(i,1,n) a[i]=read();
    37. /*状态表示:f[i]表示以a[i]结尾的最大的上升序列。
    38. 状态计算(集合划分):j∈(0,1,2,..,i-1),
    39. a[i]>a[j]
    40. f[i] = max(f[i], f[j] + 1)。
    41. 最后在找f[i]的最大值。
    42. */
    43. int ans=0;
    44. rep2(i,1,n){
    45. f[i]=1;//最小的就是自己为1
    46. rep3(j,1,i)
    47. if(a[j]max(f[i],f[j]+1);
    48. ans=max(ans,f[i]);
    49. }
    50. print(ans);
    51. return 0;
    52. }
    1. N=1010
    2. #初始化dp数组为1
    3. #表示以第i个字符结尾最长上升子序列长度
    4. dp=[1]*N
    5. n=int(input())
    6. a=[int(x) for x in input().split()]
    7. for i in range(n):
    8. for j in range(i):
    9. if a[j]
    10. dp[i]=max(dp[i],dp[j]+1)
    11. print(max(dp))

    二、最长上升子序列IIIO链接

    本题思路:上面问题的优化写法,对于数据量很大时可以考虑二分优化,首先找到一个最大的小于等于当前数的数, 我们可以用 二分 来优化,先定义边界,l = 0, r = len, 其中len是q数组的长度
    通过q[r + 1] = a[i]来将x覆盖a的值,即r + 1 > len时, 表示超出了二分边界,这时就要len ++更新q的长度。

    1. #include
    2. constexpr int N=100010;
    3. int n;
    4. int a[N],q[N];
    5. int binary_search(int l,int r,int x)
    6. {
    7. while(l
    8. int mid=l+r+1>>1;
    9. if(q[mid]
    10. else r=mid-1;
    11. }
    12. return l;
    13. }
    14. int main()
    15. {
    16. std::ios::sync_with_stdio(false);
    17. std::cin.tie(nullptr);std::cout.tie(nullptr);
    18. std::cin>>n;
    19. for(int i=0;i>a[i];
    20. int len=0;
    21. for(int i=0;i
    22. int l=0,r=len;
    23. int k=binary_search(l,r,a[i]);//找出第一个小于等于当前的数
    24. len=std::max(len,k+1);//此时k+1超出len,则需要更新len
    25. q[k+1]=a[i];
    26. }
    27. std::cout<
    28. return 0;
    29. }
    1. N=100010
    2. q=[0]*N
    3. n=int(input())
    4. a=[int(x) for x in input().split()]
    5. len=0
    6. for i in range(n):
    7. l=0
    8. r=len
    9. while l
    10. mid=(l+r+1)//2
    11. if q[mid]
    12. l=mid
    13. else:
    14. r=mid-1
    15. len=max(len,r+1)
    16. q[r+1]=a[i]
    17. print(len)

  • 相关阅读:
    CSS:上面固定高度、下面填充满,上面消失,下面仍然填充满
    自己部署 Docker Kong
    搜维尔科技:网球运动员使用Xsens寻求精确的动作捕捉
    Redis可视化工具-Another Redis Desktop Manager 安装
    Why indigenous forest guardianship is crucial to climate action?
    RabbitMQ传递序列化/反序列化自定义对象时踩坑
    Loki+Grafana查询语句
    性价比高的照明品牌,五款经济实惠的照明品牌推荐
    运行jar时提示缺少依赖的类
    基于node.js的网页聊天系统设计与实现
  • 原文地址:https://blog.csdn.net/qq_67458830/article/details/132987858