单调队列优化dp详解

单调队列及单调队列优化DP详解 单调队列 详解博客 三个步骤: 判断队头决策与i的距离是否超出M的范围,若超出则出队 此时队头就是右端点为i时,左端点j的最优选择 不断删除队尾决策,直到队尾的S值小于S[i]。然后把i作为一个新的决策入队。 //单调队列板子 (区间和最大) int l = 1, r = 1; q[1] = 0; for(int i = 1; i <= n; ++i){ while(l <= r && q[l] < i - m) l++; //step 1 ans = max 阅读详情

要想了解单调队列,我们得要先看一道题来明白.我们可以先看看这道叫做“我要长高”的题目.

Description
韩父有N个儿子,分别是韩一,韩二…韩N。由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万。舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐。由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C*(韩i与韩i+1的高度差(1<=i< N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高或什么也不做),增高1cm是很容易的,可是增高10cm花费就很大了,对任意韩i,增高Hcm的花费是H^2.请你帮助韩父让韩家损失最小。

Input
有若干组数据,一直处理到文件结束。 每组数据第一行为两个整数:韩子数量N(1<=N<=50000)和舟子系数C(1<=C<=100) 接下来N行分别是韩i的高度(1<=hi<=100)。

我们可以看到这道题:dp!怎么d?想怎么d怎么d。。。好吧其实我们可以分析一下————很容易想到在枚举每个儿子的时候,当前儿子的花费都会受到且只受到前一个儿子的影响,可以建一个dp[i][j]表示当前第i个孩子身高为j的情况。状态转移方程为dp[i][j]=min(dp[i-1][k] + abs(j-k)C + (a[i]-j)(a[i]-j)) a[i]是当前枚举人本身的身高,我们知道他们都可以增高,所以你在状态转移的时候,需要枚举前一个人的身高和这个人的身高k和j,a[k]<=k<=100,a[j]<=j<=100(注意只能增高——可能穿了什么恨天高牌增高鞋),这样dp确实可以d,但是不要高兴的太早了——我们来分析一下时间复杂度——我们要枚举每个人,枚举到每个人的时候还要枚举当前人的身高,还有之前人的身高,从给出的Input数据来看,在两秒的时间限制内————超时!怎么办,玫瑰色的人生还没有开始就结束了,我能怎么办,我也很绝望…

不过不用着急,我们可以用单调队列来帮你解决.分析一下这个方程,我们可以看到有一个abs的东西,即是绝对值,所以我们来分析两种情况,一种是前面那个人比当前枚举的人高,一种前面那个人比当前枚举的人矮,这样我们就可以吧绝对值的帽子去掉,建设新农村…好吧优化dp的新办法。我们看一下去掉绝对值的方程.
当第 i 个儿子的身高比第 i-1 个儿子的身高要高时,
dp[i][j]=min(dp[i-1][k] + j*C-k*C + X); ( k<=j ) 其中 X=(x[i]-j)*(x[i]-j)。
当第 i 个儿子的身高比第 i-1 个儿子的身高要矮时,
dp[i][j]=min(dp[i-1][k] - j*C+k*C + X); ( k>=j ).

我们便可以在去掉绝对值的情况下进行分类讨论.首先,我们先令一个二维数组f,f[i-1][k]=dp[i-1][k]-k*C, g[i][j]=j*C+X; 于是dp[i][j] =min (f[i-1][k])+g[i][j]。

在两个取绝对值的式子里面,我们可以看到都需要前一个人的花费求到一个最小值来更新当前状态,那我们可以建造一个单调递增的队列,在枚举第i个人的时候,我们把前一个人(i-1)在不同身高的状态所用的花费做成一个这样的单调队列,这样就不用枚举前一个人的身高(因为我们想要的最小值已经求出来了),所以就大大减少了时间复杂度。代码如下.

#include<stdio.h>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int dp[2][101],q[101],h,t,cur,x,n,c,ans,k;
inline const int read()
{
  register int x=0,f=1;
  register char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  return x*f;
}//读入优化
int main()
{ 
  while(scanf("%d%d",&n,&c)!=EOF)
  { ans=inf;
    x=read();
    cur=0;//cur 是为了滚动数组的 
    for(int i=0;i<x;i++) dp[cur][i]=inf;//不能变矮,赋为超大值
    for(int i=x;i<=100;i++) dp[cur][i]=(i-x)*(i-x);//增高的花费
    for(register int i=1;i<n;i++)
    { 
      x=read(),cur=cur^1,h=1,t=0;//单调队列初始化,cur有涉及到位运算,cur^1可以看做1-cur
      for(int j=0;j<=100;j++)//前一个比当前高 
      {
        k=dp[cur^1][j]-j*c;
        while(h<=t&&q[t]>k) t--;//如果队尾比当前大就弹出队列,为什么?我们维护的是一个单调递增的序列,队首保存最优,为了满足这个性质,不优的全部踢掉
        q[++t]=k;//保存当前元素
        if(j<x) dp[cur][j]=inf;
        else dp[cur][j]=q[h]+j*c+(x-j)*(x-j);
        //可以代入上面的方程看看,好理解一点
      }  
      h=1,t=0;
      for(int j=100;j>=0;j--)//前一个比当前矮 
      {
        k=dp[cur^1][j]+j*c;
        while(h<=t&&q[t]>k) t--;
        q[++t]=k;
        if(j>=x) dp[cur][j]=min(dp[cur][j],q[h]-j*c+(x-j)*(x-j));//直接比较求最优了
        //这就是单调队列的好处,我们可以直接调用q[h],因为我们维护的是一个单调递增的序列,队首的自然是最小的,即min值,不需再枚举前一个人的身高,直接调用!
      }  
    } 
    for(int i=0;i<=100;i++) ans=min(ans,dp[cur][i]);
    printf("%d\n",ans);
  }
   return 0;
}

不过这道题其实是可以不用单调队列的,因为我们只需要保存最小值就可以了…用一个Min不断比较保存前一个人的最小花费即可,代码如下(不过单调队列的思想很重要!)

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inf 0x3fffffff
using namespace std;
int n,c,h[50005],dp[2][105],cur,limit,Min;
inline const int read()
{
  register int x=0,f=1;
  register char ch=getchar();
  while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  return x*f;
}
int main()
{
    while (scanf("%d%d",&n,&c)==2) {
        cur=1;
        limit=-inf;
        Min=inf;
        for(register int i=1;i<=n;++i){h[i]=read();limit=max(limit,h[i]);} 
        for(register int i=0;i<=1;++i) memset(dp[i],0x3f,sizeof(dp[i]));     
        for(int i=h[1];i<=limit;++i) dp[cur][i]=(i-h[1])*(i-h[1]); 
        for(register int i=2;i<=n;++i) { 
            cur=cur^1;
            Min=inf;
            for(int j=h[i-1];j<=limit;++j) {
                Min=min(Min,dp[cur^1][j]-c*j); 
                if (j>=h[i]) dp[cur][j]=Min+c*j+(j-h[i])*(j-h[i]);
            }
            Min=inf;
            for(int j=limit;j>=h[i];--j) {
                Min=min(Min,dp[cur^1][j]+c*j);
                if(j>=h[i]) dp[cur][j]=min(dp[cur][j],Min-c*j+(j-h[i])*(j-h[i]));
            }
            memset(dp[cur^1],0x3f,sizeof(dp[cur^1]));
        }
        for (int i=h[n];i<=limit;++i) {
            Min=min(Min,dp[cur][i]);
        }
        printf("%d\n",Min);
    }
    return 0;    
}

相信大家对单调队列有了一个初步的了解,说白了,就是少一种枚举,减去一维,直接可以获取单调队列里保存的最优解,但注意,并非所有的dp都可以用单调队列来优化,只有状态转移方程中出现了求min或max的时候才可能可以用,因为这样才符合单调队列里的性质。

现在我们进行深入,做一道很经典的题,这道题描述的是一个股神,可以预测股市行情,但是这个天才都这么牛了还需要我们帮他计算最大利润…这道题是hdu3401,可以自己看看题目大意(不过是英文的哦).

分析一下这道题,很容易知道在第i天做当前决策的时候,我们有三个选择,一是从前一天不买也不卖,二是从前i-W-1天买进一些股(w是冷冻时间,你进行一次股市操作就要至少w天后才能再次进行一次操作——注意,每次操作只能是买或者是卖,当然,你也可以不买不卖.),三是从i-W-1天卖掉一些股.问什么一定是i-w-1天呢?因为有第一种情况我们知道,在i-w-2天时我们可以通过不买也不卖来讲最优状态转移到i-w-1天,所以没必要考虑i-w-1天之前的了.
分析完情况,我们便可以想到方程。这道题的买和卖可以分成两个方程,跟上面那道我要长高分成前一个人比我高或者比我矮一样的道理.我们来看一看买的状态转移方程.

dp[i][j]=max(dp[i-W-1][k]+k*AP[i])-j*AP[i]

我们发现了max符号——求最大值?是不是意味着我们只要提前用单调队列求出最大值即可?所以我们可以令f[i-W-1][k]=dp[i-W-1][k]+k*AP[i],则dp[i][j]=max(f[i-W-1][k]) - j*AP[i]。把f数组用一个单调递减的序列维护(队首保留最大值)即可,代码如下.

#include<stdio.h>
#include<algorithm>
using namespace std;
int t,ap,bp,as,bs,dp[2004][2004],q[2004],v[2004],l,r;
int n,maxp,w;
inline const int read()
{
   register int x=0,f=1;
   register char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
   return f*x;
}
int main()
{
   t=read();
   while(t--)
   {
    n=read(),maxp=read(),w=read();   
    register int i,j;
    for(i=1;i<=w+1;i++)
    {
     ap=read(),bp=read(),as=read(),bs=read();
     for(j=0;j<=maxp;j++)
     {
      if(j<=as) dp[i][j]=-j*ap;
      else dp[i][j]=-210000000;
      if(i>1) dp[i][j]=max(dp[i][j],dp[i-1][j]);
     }
    }
    for(register int i=w+2;i<=n;i++)
    {
     ap=read(),bp=read(),as=read(),bs=read();
     int k=i-w-1;
     l=0,r=-1;
     for(j=0;j<=maxp;j++)
     { //买
       int tmp=dp[k][j]-ap*(maxp-j);
       while(l<=r&&tmp>v[r]) r--;
       q[++r]=j;
       v[r]=tmp; //v数组保存的是值
       while(j-q[l]>as) l++;
       dp[i][j]=max(dp[i-1][j],v[l]+ap*(maxp-j));
     }
     l=0,r=-1;
     for(j=maxp;j>=0;j--)
     { //卖
       int tmp=dp[k][j]+bp*j;
       while(l<=r&&tmp>v[r]) r--;
       q[++r]=j;
       v[r]=tmp;
       while(q[l]-j>bs) l++;
       dp[i][j]=max(dp[i][j],v[l]-bp*j);
     }
    }
    printf("%d\n",dp[n][0]);
   }
}

最后一道,NOI2009的经典题,瑰丽华尔兹.这道题的描述有点长,可以直接看主干部分.
【任务描述】

你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐。但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在大海上,他的名字叫丹尼•布德曼•T.D.•柠檬•1900,朋友们都叫他1900。
1900出生于20世纪的第一年出生在往返于欧美的邮轮弗吉尼亚号上,然后就被抛弃了。1900刚出生就成了孤儿,孤独的成长在弗吉尼亚号上,从未离开过这个摇晃的世界;也许是对他命运的补偿,上帝派可爱的小天使艾米丽照顾他。
可能是天使的点化,1900拥有不可思议的钢琴天赋,从未有人教,从没看过乐谱,但他却能凭着自己的感觉弹出最沁人心脾的旋律。当1900的音乐获得邮轮上所有人的欢迎时,他才8岁,而此时他已经乘着海轮往返欧美50多次了。
虽说是钢琴奇才,但1900还是个8岁的孩子,他有着和一般男孩一样的好奇的调皮,不过可能更有一层浪漫的色彩罢了:
这是一个风雨交加的夜晚,海风卷起层层巨浪拍打着弗吉尼亚号,邮轮随着巨浪剧烈的摇摆。船上的新萨克斯手迈克斯?托尼晕船了,1900将他 邀请到舞厅,然后——,然后松开了固定钢琴的闸,于是,钢琴随着海轮的倾斜滑动起来。准确的说,我们的主角1900、钢琴、邮轮随着1900的旋律一起跳 起了华尔兹,所有的事物好像都化为一体,随着“强弱弱”的节奏,托尼的晕船症也奇迹般地一点一点恢复。正如托尼在回忆录上这样写道:
大海摇晃着我们
使我们转来转去
快速的掠过灯和家具
我意识到我们正在和大海一起跳舞
真是完美而疯狂的舞者
晚上在金色的地板上快乐的跳着华尔兹是不是很惬意呢?也许,我们忘记了一个人,那就是艾米丽,她可没闲着:她必须在适当的时候施魔法帮助1900,不让钢琴碰上舞厅里的家具。而艾米丽还小,她无法施展魔法改变钢琴的运动方向或速度,而只能让钢琴停一下。
不妨认为舞厅是一个N行M列的矩阵,矩阵中的某些方格上堆放了一些家具,其他的则是空地。钢琴可以在空地上滑动,但不能撞上家具或滑出舞厅,否则会损坏钢琴和家具,引来难缠的船长。
每个时刻,钢琴都会随着船体倾斜的方向向相邻的方格滑动一格,其中相邻的方格可以是向东、向西、向南或向北的。而艾米丽可以选择施魔法或不施魔法,如果不施魔法,则钢琴会滑动,而如果施魔法,则钢琴会原地不动。 艾米丽是个天使,她知道每段时间的船体的倾斜情况。她想使钢琴尽量长时间在舞厅里滑行,这样1900会非常高兴,同时也有利于治疗托尼的晕船。但艾米丽还太小,不会算,所以希望你能帮助她。

【输入格式】

输入文件的第一行包含5个数N, M, x, y和K。N和M描述舞厅的大小,x和y为在第1时刻初钢琴的位置(x行y列);我们对船体倾斜情况是按时间的区间来描述的,比如“在[1, 3]时间里向东倾斜,[4, 5]时间里向北倾斜”,因此这里的K表示区间的数目。
以下N行,每行M个字符,描述舞厅里的家具。第i行第j列的字符若为‘ . ‘,则表示该位置是空地;若为‘ x ‘,则表示有家具。
以下K行,顺序描述K个时间区间,格式为:si ti di(1 ≤ i ≤ K)。表示在时间区间[si, ti]内,船体都是向di方向倾斜的。di为1, 2, 3, 4中的一个,依次表示北、南、西、东(分别对应矩阵中的上、下、左、右)。输入保证区间是连续的,即

s1 = 1
ti = si-1 + 1 (1 < i ≤ K)
tK = T
【输出格式】

输出文件仅有1行,包含一个整数,表示钢琴滑行的最长距离(即格子数)。

【输入样例】

4 5 4 1 3
..xx.
…..
…x.
…..
1 3 4
4 5 1
6 7 3
【输出样例】

6

显然我们可以枚举时间,行,列无脑do,当然——要超时.我们可以看见,在dp的是后当d==1即往上走,每一列就可用单调队列维护信息,时间由原来的枚举t,变到枚举k(时间段).

#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=201;

int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int f[2][maxn][maxn],q[maxn],v[maxn];
char map[maxn][maxn];
int n,m,x,y,k,ans;
int cur1=1,cur2;
int a,b,c;

inline const int read(){
   register int x=0,f=1;
   register char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
   return x*f;
}

inline void solve(int x,int y,int w,int len,int c){
   register int i,h=1,t=0,k;
   for(i=1;i<=w;i++){
     if(map[x][y-1]=='.'){
       k=f[cur1][x][y]+w-i;
       while(h<=t&&k>v[t]) t--;
       v[++t]=k;
       q[t]=i;
       while(i-q[h]>len) h++;
       f[cur2][x][y]=v[h]-w+i;
     }
     else h=t+1,f[cur2][x][y]=-2e9;
     x=x+dx[c];
     y=y+dy[c];
   }
}

int main(){  
   register int i,j;
   n=read(),m=read(),x=read(),y=read(),k=read();
   for(i=1;i<=n;i++) scanf("%s",map[i]);
   for(i=1;i<=n;i++)
       for(j=1;j<=m;j++) f[0][i][j]=-2e9;
   f[0][x][y]=0;
   for(i=1;i<=k;i++){
       cur1=cur1^1;
       cur2=cur2^1;
       a=read(),b=read(),c=read(); 
       if(c==1) for(j=1;j<=m;j++) solve(n,j,n,b-a+1,c-1);  
       if(c==2) for(j=1;j<=m;j++) solve(1,j,n,b-a+1,c-1);  
       if(c==3) for(j=1;j<=n;j++) solve(j,m,m,b-a+1,c-1);  
       if(c==4) for(j=1;j<=n;j++) solve(j,1,m,b-a+1,c-1);   
   } 
   for(i=1;i<=n;i++)  
       for(j=1;j<=m;j++) ans=max(ans,f[cur2][i][j]);  
   printf("%d\n",ans); 
}

希望这篇博客能对大家有所帮助.

滑动窗口最小值问题:单调队列算法详解与C++实现 在算法与数据结构领域,区间查询和滑动窗口是处理序列数据的核心概念。其基本原理在于高效地维护一个动态变化的数据子集,并快速响应关于该子集的查询请求。从技术价值看,这直接关系到算法的时间复杂度优化,是解决大规模数据处理问题的关键。在工程实践中,这类技术广泛应用于实时监控、流数据处理、性能分析及动态规划优化等场景。本文以信息学竞赛经典题目P2251“质量检测”为例,深入剖析了利用单调队列这一数据结构,在O(N)时间复杂度内高效求解滑动窗口最小值问题的完整方案,并提供了清晰的C++代码实现与调试技巧,帮助读者掌握这 阅读详情

相关推荐

华为OD机试“跳格子3”动态规划详解:状态设计与单调队列优化

动态规划是解决最优化问题的核心算法思想,其本质是通过定义状态和状态转移方程,将复杂问题分解为重叠子问题。在算法竞赛与工程实践中,面对如路径规划、资源分配等问题,动态规划能高效求出最优解。其技术价值在于以多项式时间复杂度解决看似指数级的问题,关键在于无后效性的状态设计和高效的转移优化。针对“跳格子”这类经典问题,常需处理带约束的序列决策,例如有限次特殊跳跃机会。本文以华为OD机试热门题目“跳格子3”为例,深入剖析如何通过增加状态维度(如记录超级跳跃使用次数)来建模复杂约束,并运用单调队列优化滑动窗口最值查询,

weixin_32520095的博客 344

单调队列优化的DP问题

单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题。

xjsc01的博客 1135

在安装之后使用labelme出现qtpy.PythonQtError:No Qt bindings could be found错误

我在base环境(python3.7)可成功安装和使用labelme,而在同py37版本和py36的虚拟环境中可安装labelme包,但在使用的时候出现报错,如下: 我尝试着去解决第一个错误提示,错误提示为:moduleNotFoundError:No module named ‘PySide’,结果掉入了一个无止无尽的坑,看到网上有朋友说这个只能在py27-py35才能安装,还有说需要VC+ 140等,他们说的这个解决方案只针对于这个缺包的描述,而我们仅仅只需要一个labelme,因此我直接对后面的错误

qq_33538651的博客 9814

单调队列优化DP

单调队列优化DP最大子序和修剪草坪旅行问题烽火传递绿色通道理想的正方形 在多重背包问题3中,我们用到了单调队列优化DP,实际上,不止这个问题,很多问题我们仔细观察,就能发现它有类似的性质,我们就能用单调队列优化,我们通过几道题的练习来观察观察其中的规律。 最大子序和 题目链接:最大子序和 修剪草坪 题目链接:修剪草坪 旅行问题 题目链接:旅行问题 烽火传递 题目链接:烽火传递 绿色通道 题目链接:绿色通道 理想的正方形 题目链接:理想的正方形 ...

csdnwqy030429的博客 2706

KALI虚拟机挂代理教程

需要你本地挂了代理,然后通过虚拟机连接本机代理端口,不说废话了,直接说怎么做了。 1.查看选项设置中自己的小飞机的本地端口是多少:(默认是1080) 2.本机win+r打开cmd,输入ipconfig查看本地ip,我的本地ip是192.168.0.107: 2.打开kali虚拟机,编辑ProxyChains配置文件: vi /etc/proxychains.conf 3.在文件末尾的ProxyList中添加物理机本地ip和1080端口作为代理地址: 4.保存并退出即可: esc :wq 回车 5.

qq_34853514的博客 3万+

28GHz毫米波滤波器设计实战:用SynMatrix快速搞定SIW带通滤波器(附完整参数)

本文详细介绍了如何使用SynMatrix工具链高效设计28GHz SIW带通滤波器,涵盖智能参数预测、多物理场联合优化和加工误差补偿等核心技术。通过实战案例和完整参数模板,帮助射频工程师快速实现毫米波滤波器设计,显著提升工作效率并避免反复迭代。

weixin_29284657的博客 495

单调队列优化 DP

的状态转移方程,标清楚 决策 的上下界,然后依据 转移 的性质用 单调队列维护 决策集合 ,进而优化复杂度。,而 决策集合 是从左向右滑动的,这样会不会导致某些后面的有效决策被排除?那么基于 减少无用决策出发:当本层的高度最大时,只保留 最小的 长度即可。位置的决策 排除了在它后面的部分元素,现在它出队了,谁有能是最优呢?整体上看,转移时需要维护到两个信息:当前层的长度,上一层的长度。时,首先让部分决策出队,并从 set 中删除,不需要更改。这是第一步的转移,去除了有空板 / 空人的影响。

qq_56326461的博客 764

手把手教你用ArduPilot搭建低成本无人车(附APM飞控+有刷电调配置清单)

本文提供了一份基于ArduPilot开源平台搭建低成本智能无人车的详细实战指南。核心内容包括APM架构飞控的选型、双向有刷电调的兼容性配置与校准、系统连接逻辑,以及通过Mission Planner地面站进行参数调校和自主导航功能设置的完整流程,帮助爱好者快速实现从手动控制到自主行驶的跨越。

java5的博客 849

单调队列优化dp

如上图,可以跳到 3−7 这个区间,跳到 3 和 4 的时候,都是消耗劳累度的,但是我们选择哪个更好呢,当然是越大的越好,因为高度越高,下一次越有利,如上图,当我们跳到 4 ,下一次跳到 3 的时候就不增加劳累度。如果暴力枚举那个区间,一般会超时,于是我们可以选择将最大值放入队头的最大值或者最小值,通过这样维护我们可以减去暴力枚举的过程,优化了时间复杂度。维护这样一个队列的好处是,当我们想求最大值的时候,我们只需要保证队列是单调递增的,于是每次取出队头就是我们的最大值。第一个元素下标进队列,此时队列为。

m0_74176921的博客 639

PCB中的CAF深度剖析与对策研究

摘要:本文系统研究了PCB板的导电阳极丝(CAF)问题,阐明了CAF是在电场作用下铜离子沿玻纤微裂通道迁移形成导电丝的现象,其形成需铜、水汽、电解质、偏压和迁移通道五个条件。CAF会导致PCB绝缘性能下降和信号传输异常,严重影响电子产品可靠性。研究提出了板材选择、钻孔工艺控制、叠板结构优化等预防措施,以及增大孔距、错位排列等设计注意事项,并介绍了IPC-TM-650-2.6.25测试标准。未来应在耐CAF材料、测试技术和制造工艺方面深入研究,以提升PCB可靠性。(150字)

2401_84691632的博客 1704

088、多摄像头跨镜目标追踪 ID 频繁切换?ReID 特征 + 轨迹关联 + 时间约束方案

文章摘要:本文针对多摄像头跨镜目标追踪中ID频繁切换的问题,提出了一种结合ReID特征、轨迹关联和时间约束的综合解决方案。作者分析了ID切换的三个主要原因:ReID特征不稳定、轨迹关联依赖最近邻匹配以及忽略时间约束。通过改进ReID特征提取(多层特征融合)、引入轨迹预测(卡尔曼滤波)和添加时间窗口约束,成功将ID切换率从35%降至3%以下。文章详细分享了实现细节和踩坑经验,为跨摄像头目标追踪提供了实用优化思路。

ai技术增长的博客 169

单调队列/单调栈优化dp

单调队列/单调栈优化dp

qq_33969563的博客 1448

智能体异常行为检测-基于行为序列的异常模式识别技术【附代码】

在多智能体系统(Multi-Agent Systems, MAS)中,智能体之间的行为协调与自主决策是系统稳定运行的关键。然而,当某个智能体因策略偏移、环境变化或潜在攻击而出现**异常行为(Abnormal Behavior)**时,整个系统可能陷入混乱或崩溃。

一键难忘的博客 1142

单调队列优化DP详解

细说单调队列优化dp原理及效率提升对比~

风的记忆 2966

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

AI人人懂 234

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

poj 1821 单调队列优化dp详解

/* poj 1821    *******************************************************************    单调队列优化;    *******************************************************     dp[i][j]:前i个最终刷到第j块木板所得最大收益;    dp[i][

雨林的博客 1005

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

浅谈单调队列优化的DP

为什么都是浅谈?深入就掉坑啊,掉坑就要填坑啊,填坑就会发现又挖了更多的坑啊,然后恶性循环啊。 这个坑必须要填的,拖了这么久了。 先拿TYVJ 1305来说吧,此题具体的题面没找到,代码简单的对拍了一下,若存在错误,还请指出。 题目的意思是n个数,在区间m内,找到最大子段和。O(nlogn)可以解决,用单调队列优化下成为线性时间。 容易得到状态转移方程:dp[i] = sum[i] - min{s...

Ever_glow的博客 5899

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

浅谈单调队列优化dp

什么是单调队列? 举个浅显的例子: 滑动窗口:给出n个数,要求从每个位置开始到其后的k位中的最大值。 显然这题可以用RMQ问题的做法解,但用单调队列效率最高。 我们维护一个队列,这个队列有两个参数,一个是位置编号,一个是其值,这个队列具有“编号单调增,值单调减”的特点,因为如果i>j,且a[i]>a[j],显然只要i和j在一个窗口中,j就不会是最大值,我们可以把j删掉(对于冗余状态

Holylight_Knight 1148

单调队列,滑动窗口

对每一个窗口长度为n,求窗口内部(s[j])最小值,判断最小值是否大于等于窗口左边界前一个位置。,按a1,a2,a3,a4,a1,a2,a3 的顺序累加;求滑动窗口内最大值:队列单调递减(队头是窗口最大值)求滑动窗口内最小值:队列单调递增(队头是窗口最小值)维护窗口内 (s[j]) 的最小值(队列单调递增)。注意:是看乘客,不是看船;给定环形数组 a1,a2,a3,an,选择起点。维护在单调队列里,队头就是最优的。,主要用来解决滑动窗口最值问题。单调队列:队列内部元素保持。(滑动窗口式的j区间)。

2601_95206475的博客 238

【学习笔记】斜率优化 DP

下凸壳。

XN5Dd3751的博客 184

dp单调队列优化

本文介绍了单调栈和队列的基本概念及其实现方法,并通过洛谷P2034题目展示了单调队列在动态规划中的应用。单调栈通过手动实现或STL库保持元素单调性,而队列则遵循先进先出原则。在解决P2034问题时,通过将问题转化为删除最小和的方式,利用单调队列优化比大小过程,显著提升了效率。文章提供了手搓和STL两种实现代码,帮助读者理解并应用该算法。

xiaowu114514的博客 1214

DP 优化一:单调队列优化 DP

本文介绍了动态规划中的单调队列优化方法。首先解释了单调队列的概念及其在线性时间内求区间最值的优势,通过滑动窗口例题展示了具体实现过程。然后重点讲解了如何利用单调队列优化特定形式的DP转移方程,即形如f[i]=min{f[j]+F(j)+C}的情况。最后以一道粉刷围栏的题目为例,展示了如何将暴力DP解法转化为单调队列优化形式,通过数学变形将转移方程改写为可优化结构,从而显著提升算法效率。文章通过具体例题和代码示例,系统性地阐述了单调队列优化的原理和应用场景。

cwplh的博客 657

单调队列优化DP——AcWing 135. 最大子序和

单调队列优化DP是一种在动态规划(Dynamic Programming, DP)中应用的数据结构优化方法。它利用单调队列(Monotonic Queue)这一数据结构来高效维护一个区间内的最值(通常是最大值或最小值),从而减少DP状态的计算量,提升算法效率。单调队列内部保持元素的单调性(递增或递减),并能快速地在队列头部获取区间最值,同时在队列尾部进行元素的插入与删除以维持单调性。

u014114223的博客 1199

单调队列优化DP核心总结

单调队列优化DP是一种高效处理特定动态规划问题的方法。它适用于转移方程可分离为最值形式且转移区间单调不减的情况,通过维护单调队列将复杂度从$O(N^2)$降至$O(N)$。核心操作包括去除过期决策点、维护队列单调性和获取最优解。典型应用包括切蛋糕、琪露诺等题目,相比线段树优化更适合处理滑动窗口最值问题。该方法要求决策区间单调且不含交叉项,能有效提升特定DP问题的求解效率。

这里是小鸽子娅的博客喵~ 317
上一篇: 后缀数组详解
下一篇: 平衡树之treap
MaxMercer
博客等级 码龄10年 55粉丝 261原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值