• 蓝桥杯打卡Day10



    文章目录

    • 最长ZigZag子序列
    • 最小面积子矩阵

    一、最长ZigZag子序列IO链接

    本题思路:本题是一道dp问题, 集合划分:只有一个a[i]或者倒数第二个元素是第j个数字并且需要是下降得到a[j]:g[j]+1,状态计算f[i]=max(f[i],g[j]+1),这是第一种情况,还有一种是只有一个a[i]或者倒数第二个元素是第j个数字并且需要是上升得到a[j]:f[j] + 1状态计算g[i]=max(g[i],f[j]+1),这是第二种满足条件,那么每个状态最长的即为res=max(f[i],g[i])中最长的子序列。

    1. #include
    2. constexpr int N=55;
    3. //集合划分:【只有一个a[i]】【其他:倒数第二个元素是第j个数字并且需要是下降得到a[j]:g[j] + 1】
    4. //状态计算:f[i] = max(f[i], g[j] + 1);
    5. int n;
    6. int a[N];
    7. int f[N];//表示以第i个数字结尾并且是前一个数字上升得到的a[i]
    8. int g[N];//表示以第i个数字结尾并且是前一个数字下降得到的a[i]
    9. int main()
    10. {
    11. std::ios::sync_with_stdio(false);
    12. std::cin.tie(nullptr);std::cout.tie(nullptr);
    13. std::cin>>n;
    14. for(int i=1;i<=n;i++) std::cin>>a[i];
    15. int res=0;
    16. for(int i = 1; i <=n; i ++ ){
    17. f[i] = g[i] = 1;
    18. for(int j = 1; j < i; j ++ ){
    19. if(a[i] > a[j]) f[i] = std::max(g[j] + 1, f[i]);
    20. else if(a[i] < a[j])
    21. g[i] = std::max(f[j] + 1 , g[i]);
    22. }
    23. res = std::max(res, std::max(f[i], g[i]));
    24. }
    25. std::cout<
    26. return 0;
    27. }

    二、最小面积子矩阵IO链接

     本题思路:本题可以采用前缀和和双指针的方式,暴力也可以做知识复杂度比较高,将每一列进行一维前缀和操作,然后我们首先枚举上下边界,然后枚举左右边界,要求包含元素最少的子矩阵(右边界固定的时候,左边界往右总和变小,面积也变小)。

    1. #include
    2. constexpr int N=110;
    3. #define INF 0x3f3f3f3f
    4. int n,m,k;
    5. int g[N][N];
    6. int ans=INF;
    7. int main()
    8. {
    9. std::ios::sync_with_stdio(false);
    10. std::cin.tie(nullptr);std::cout.tie(nullptr);
    11. std::cin>>n>>m>>k;
    12. for(int i=1;i<=n;i++)
    13. for(int j=1;j<=m;j++){
    14. std::cin>>g[i][j];
    15. g[i][j]+=g[i-1][j];
    16. }
    17. for(int x=1;x<=n;x++)//处理上下边界
    18. for(int y=x;y<=n;y++)
    19. for(int l=1,r=1,sum=0;r<=m;r++){//对边界中的矩阵进行枚举
    20. sum+=g[y][r]-g[x-1][r];
    21. while(sum-g[y][l]+g[x-1][l]>=k)
    22. {
    23. sum-=g[y][l]-g[x-1][l];
    24. l++;
    25. }
    26. if(sum>=k) ans=std::min(ans,(y-x+1)*(r-l+1));
    27. }
    28. if(ans==INF) std::cout<<-1<
    29. else std::cout<
    30. return 0;
    31. }

  • 相关阅读:
    rm The parameter list is too long argument list too long
    C++学习之多继承
    quarkus实战之七:使用配置
    【AI视野·今日CV 计算机视觉论文速览 第262期】Fri, 6 Oct 2023
    网络流应用(一)
    大数据开发 hadoop集群 2.hadoop框架入门
    微信超实用的小功能
    猿创征文|高效能IT项目经理百宝箱中的五子良将
    ES filter查询 高亮查询 聚合查询
    Java 提取HTML文件中的文本内容
  • 原文地址:https://blog.csdn.net/qq_67458830/article/details/132902067