蓝桥杯打卡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])中最长的子序列。

cpp 复制代码
#include <bits/stdc++.h>

constexpr int N=55;

//集合划分:【只有一个a[i]】【其他:倒数第二个元素是第j个数字并且需要是下降得到a[j]:g[j] + 1】
//状态计算:f[i] = max(f[i], g[j] + 1);
int n;
int a[N];
int f[N];//表示以第i个数字结尾并且是前一个数字上升得到的a[i]
int g[N];//表示以第i个数字结尾并且是前一个数字下降得到的a[i]

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);
  
  std::cin>>n;
  for(int i=1;i<=n;i++) std::cin>>a[i];
  
  int res=0;
  for(int i = 1; i <=n; i ++ ){
        f[i] = g[i] = 1; 
        for(int j = 1; j < i; j ++ ){
            if(a[i] > a[j]) f[i] = std::max(g[j] + 1, f[i]);
            else if(a[i] < a[j])
                g[i] = std::max(f[j] + 1 , g[i]);
        }
        res = std::max(res, std::max(f[i], g[i]));
    }
  
  std::cout<<res<<std::endl;
  return 0;
}

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

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

cpp 复制代码
#include <bits/stdc++.h>

constexpr int N=110;
#define INF 0x3f3f3f3f

int n,m,k;
int g[N][N];
int ans=INF;

int main()
{
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);std::cout.tie(nullptr);
  
  std::cin>>n>>m>>k;
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
      std::cin>>g[i][j];
      g[i][j]+=g[i-1][j];
    }
    
  for(int x=1;x<=n;x++)//处理上下边界
    for(int y=x;y<=n;y++)
      for(int l=1,r=1,sum=0;r<=m;r++){//对边界中的矩阵进行枚举
        sum+=g[y][r]-g[x-1][r];
        while(sum-g[y][l]+g[x-1][l]>=k)
        {
          sum-=g[y][l]-g[x-1][l];
          l++;
        }
        
        if(sum>=k) ans=std::min(ans,(y-x+1)*(r-l+1));
      }
      
      if(ans==INF) std::cout<<-1<<std::endl;
      else std::cout<<ans<<std::endl;
  return 0;
}
相关推荐
huaCodeA3 小时前
Android面试-Flow相关
android·面试·职场和发展
JAVA社区3 小时前
Java进阶全套教程(三)—— Spring框架核心精讲
java·开发语言·spring·面试·职场和发展·mybatis
始三角龙4 小时前
LeetCode hoot 100 -- 缺失的第一个正整数
算法·leetcode·职场和发展
fqq34 小时前
java基础面试题目
面试·职场和发展
小江的记录本5 小时前
【Java并发编程】锁机制:volatile:JMM内存模型、可见性/禁止指令重排、内存屏障、单例模式中的应用(附《思维导图》+《面试高频考点清单》)
java·后端·python·mysql·单例模式·面试·职场和发展
_日拱一卒6 小时前
LeetCode:105从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
天真小巫6 小时前
六年之约-2026.5.22
职场和发展
JAVA社区7 小时前
Java进阶全套教程(一)—— 数据框架Mybatis详解
java·开发语言·面试·职场和发展·mybatis
JAVA社区7 小时前
Java进阶全套教程(八)—— Docker超详细实战详解
java·运维·开发语言·docker·容器·面试·职场和发展
运筹vivo@8 小时前
3043. 最长公共前缀的长度(Leetcode 每日一题)
c++·算法·leetcode·职场和发展·每日一题