【算法基础】动态规划

news2024/10/7 18:22:26

背包问题

01背包

每个物品只能放一次

2. 01背包问题 - AcWing题库

二维dp

#include<bits/stdc++.h>
const int N=1010;
int f[N][N];
int v[N],w[N]; 
signed main()
{
	int n,m;
	std::cin>>n>>m; 
	for(int i=1;i<=n;i++) std::cin>>v[i]>>w[i];
	
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=v[i]) f[i][j]=std::max(f[i][j],f[i-1][j-v[i]]+w[i]);	
		} 
	}	
	std::cout<<f[n][m];
	return 0;
}

一维dp

观察上面的循环内的式子,发现推导出f[i][j]只需要f[i-1][j]和f[i-1][j-v[i]]就好,也就是当前的f[i]是由上一层f[i-1]推导而来,因此我们用到滚动数组来对二维dp进行优化。

滚动数组是一种优化算法技巧,常用于动态规划问题中,用来减少空间复杂度。在动态规划问题中,我们通常需要使用一个数组来存储中间计算的结果,以供后续计算使用。而滚动数组通过利用数组中的部分空间,不断覆盖原来的值,从而减少所使用的空间。

具体来说,滚动数组通常用一个较小的大小来表示原数组,这个较小的大小是经过推导和分析所确定的。在计算过程中,我们只需要维护这个较小的数组,当需要用到原数组中的值时,通过计算得到。

这种技巧能够在一定程度上减少使用的空间复杂度,特别是针对一些状态转移方程只与之前的一部分状态有关的情况。滚动数组在动态规划问题中被广泛应用,能够提高算法的效率。

同时, 原循环中f[i][j]=std::max(f[i][j],f[i-1][j-v[i]]+w[i]);,如果j是正序即从v[i]-m,那么这里的f[j-v[i]]就是f[i][j-v[i]],因为在循环中正序从小到大会覆盖掉之前的f[i-1],故而采取逆序。滚动数组(简单说明)_滚动数组思想-CSDN博客    

#include<bits/stdc++.h>
const int N=1010;
int f[N];
int v[N],w[N]; 
signed main()
{
	int n,m;
	std::cin>>n>>m; 
	for(int i=1;i<=n;i++) std::cin>>v[i]>>w[i];
	
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			f[j]=std::max(f[j],f[j-v[i]]+w[i]);	
		} 
	}	
	std::cout<<f[m];
	return 0;
}

完全背包

物品有无限件

3. 完全背包问题 - AcWing题库

三重循环

额外加一层循环来枚举选择当前项的个数,这样会超时

#include<bits/stdc++.h>
const int N=1010;
int f[N][N];
int v[N],w[N]; 
signed main()
{
	int n,m;
	std::cin>>n>>m; 
	for(int i=1;i<=n;i++) std::cin>>v[i]>>w[i];
	
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			for(int k=0;k*v[i]<=j;k++)
			{
				f[i][j]=std::max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
			}
		}
	}	
	std::cout<<f[n][m];
	return 0;
}

 二重循环

与01背包不同的是max里面是f[i][j-v[i]]+w[i],01背包中这里是 f[i-1][j-v[i]]+w[i]

因此下面优化成一维时对j的枚举按升序就好。

#include<bits/stdc++.h>
const int N=1010;
int f[N][N];
int v[N],w[N]; 
signed main()
{
	int n,m;
	std::cin>>n>>m; 
	for(int i=1;i<=n;i++) std::cin>>v[i]>>w[i];
	
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=m;j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=v[i]) f[i][j]=std::max(f[i][j],f[i][j-v[i]]+w[i]);
		}
	}	
	std::cout<<f[n][m];
	return 0;
}

一维循环 

#include<bits/stdc++.h>
const int N=1010;
int f[N];
int v[N],w[N]; 
signed main()
{
	int n,m;
	std::cin>>n>>m; 
	for(int i=1;i<=n;i++) std::cin>>v[i]>>w[i];
	
	for(int i=1;i<=n;i++)
	{
		for(int j=v[i];j<=m;j++)
		{
			f[j]=std::max(f[j],f[j-v[i]]+w[i]);
			
		}
	}	
	std::cout<<f[m];
	return 0;
}

多重背包问题 

物品只有s[i]件

4. 多重背包问题 I - AcWing题库

 三重循环

#include<bits/stdc++.h>
const int N=1e3+10;
int v[N],w[N],s[N];
int num,val;
int f[N][N];//从前i件中选,剩余容量为 

signed main()
{
	std::cin>>num>>val;	
	for(int i=1;i<=num;i++) std::cin>>v[i]>>w[i]>>s[i];
	
	for(int i=1;i<=num;i++)//枚举物品 
	{
		for(int j=0;j<=val;j++)
		{
			for(int k=0;k*v[i]<=j&&k<=s[i];k++)
			{
				f[i][j]=std::max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
			}
		} 
	}
	std::cout<<f[num][val];
	return 0;
}

二进制优化 

 5. 多重背包问题 II - AcWing题库

#include<bits/stdc++.h>
const int N = 12010, M = 2010;
int v[N], w[N];
int f[M];
int num,val,cnt;
signed main()
{
	std::cin>>num>>val;
	for(int i=1;i<=num;i++)
	{
		int a,b,s;
		std::cin>>a>>b>>s;
		int k=1;
		while(s>=k)
		{
			cnt++;
			v[cnt]=a*k;
			w[cnt]=b*k;
			s-=k;
			k*=2;	
		}	
		if(s) 
		{
			cnt++;
			v[cnt]=a*s;
			w[cnt]=b*s;
		}
	}
	for(int i=1;i<=cnt;i++)	
	{
		for(int j=val;j>=v[i];j--)
		{
			f[j]=std::max(f[j],f[j-v[i]]+w[i]);		
		}
	}
	std::cout<<f[val];
	return 0;
}

分组背包问题

9. 分组背包问题 - AcWing题库

每组物品有若干个,同一组内的物品最多只能选一个。

二维dp

#include<bits/stdc++.h>
const int N=110;

int s[N],w[N][N],v[N][N],f[N][N];
int num,val;
signed main()
{
	std::cin>>num>>val;//组数 
	for(int i=1;i<=num;i++)
	{
		std::cin>>s[i];
		for(int j=1;j<=s[i];j++)
		{
			std::cin>>v[i][j]>>w[i][j];
		}
	}
	for(int i=1;i<=num;i++)
	{
		for(int j=0;j<=val;j++)
		{
		    f[i][j]=f[i-1][j];
			for(int k=0;k<=s[i];k++)
			{
				if(j>=v[i][k]) f[i][j]=std::max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
			}
		} 
	}
	std::cout<<f[num][val];
	return 0;
}

 一维dp

#include<bits/stdc++.h>
const int N=110;

int s[N],w[N][N],v[N][N],f[N];
int num,val;
signed main()
{
	std::cin>>num>>val;//组数 
	for(int i=1;i<=num;i++)
	{
		std::cin>>s[i];
		for(int j=1;j<=s[i];j++)
		{
			std::cin>>v[i][j]>>w[i][j];
		}
	}
	for(int i=1;i<=num;i++)
	{
		for(int j=val;j>=0;j--)
		{
			for(int k=1;k<=s[i];k++)
			{
				if(j>=v[i][k]) f[j]=std::max(f[j],f[j-v[i][k]]+w[i][k]);
			}
		} 
	}
	std::cout<<f[val];
	return 0;
}

线性DP 

数字三角形

898. 数字三角形 - AcWing题库

#include<bits/stdc++.h>
const int N=510;
int f[N][N],a[N][N];

signed main()
{
	int n;
	std::cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i;j++) std::cin>>a[i][j];
	}
	for(int i=n;i>=1;i--)
	{
		for(int j=1;j<=i;j++)
		{
			f[i][j]=std::max(f[i+1][j],f[i+1][j+1])+a[i][j];
		}
	}
	std::cout<<f[1][1];
	return 0;
}

最长上升子序列

双重循环

895. 最长上升子序列 - AcWing题库

#include<bits/stdc++.h>
const int N=1e3+10;
int a[N],f[N];

signed main()
{
	int n;
	std::cin>>n;
	for(int i=1;i<=n;i++) std::cin>>a[i];
	
	for(int i=1;i<=n;i++)
	{
		f[i]=1;
		for(int j=1;j<i;j++)
		{
			if(a[j]<a[i]) f[i]=std::max(f[i],f[j]+1);	
		}	
	}
	int res=-1e9;
	for(int i=1;i<=n;i++) res=std::max(res,f[i]);
	std::cout<<res;
	return 0; 
}

 优化

#include<bits/stdc++.h>
const int N=1e3+10;
int a[N],q[N];
int n,cnt;
signed main()
{
	std::cin>>n;
	for(int i=1;i<=n;i++) std::cin>>a[i];
	
	for(int i=1;i<=n;i++)
	{
		if(a[i]>q[cnt]||!cnt) q[++cnt]=a[i];//q从1开始 
		else{
			int l=1,r=cnt,res=-1;
			while(l<=r)
			{
				int mid=l+r>>1;
				if(q[mid]>=a[i]) 
				{
					res=mid;
					r=mid-1;
				}else l=mid+1;
			}  
			q[res]=a[i];
		} 
		
	}
	std::cout<<cnt;
	return 0; 
}

最长公共子序列

897. 最长公共子序列 - AcWing题库

#include<bits/stdc++.h>
const int N=1e3+10;
char a[N],b[N];
int n,m;
int f[N][N];
signed main()
{
    std::cin>>n>>m;
    std::cin>>a+1>>b+1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            f[i][j]=std::max(f[i-1][j],f[i][j-1]);
            if(a[i]==b[j]) f[i][j]=std::max(f[i][j],f[i-1][j-1]+1);
        }
    }
    std::cout<<f[n][m];
    return 0;
}

最短编辑距离

902. 最短编辑距离 - AcWing题库

#include<bits/stdc++.h>
const int N=1e3+10;
char a[N],b[N];
int n,m;
int f[N][N];
signed main()
{
    std::cin>>n>>a+1>>m>>b+1;
    for(int i=0;i<=n;i++) f[i][0]=i;
    for(int j=0;j<=m;j++) f[0][j]=j;
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            f[i][j]=std::min(f[i-1][j],f[i][j-1])+1;//增,删的情况
            if(a[i]==b[j]) f[i][j]=std::min(f[i][j],f[i-1][j-1]);
            else f[i][j]=std::min(f[i][j],f[i-1][j-1]+1);//判断是否需要改
        }
    }
    std::cout<<f[n][m];
    return 0;
}

编辑距离

899. 编辑距离 - AcWing题库

给定n个字符串,m次询问每次给一个字符串和限制,问每次询问中n个字符串中每次有多少个可以在操作限制内改为给的字符

这里发现f数组中,前面是枚举给定字符串还是要修改的字符串不会影响答案。 

#include<bits/stdc++.h>
const int N=1e3+10;
int n,m;
char s[N][15];
int f[N][N];
/*
int dis(char a[],char s[])//把s变成a 
{
	int la=strlen(a+1),ls=strlen(s+1);
	for(int i=0;i<=la;i++) f[i][0]=i;
	for(int i=0;i<=ls;i++) f[0][i]=i;
	
	for(int i=1;i<=la;i++)
	{
		for(int j=1;j<=ls;j++)
		{
			f[i][j]=std::min(std::min(f[i-1][j]+1,f[i][j-1]+1),f[i-1][j-1]+!(a[i]==s[j]));		
		}
	} 
	return f[la][ls];
}*/
int dis(char a[],char s[])//把s变成a 
{
	int la=strlen(a+1),ls=strlen(s+1);
	for(int i=0;i<=ls;i++) f[i][0]=i;
	for(int i=0;i<=la;i++) f[0][i]=i;
	
	for(int i=1;i<=ls;i++)
	{
		for(int j=1;j<=la;j++)
		{
			f[i][j]=std::min(std::min(f[i-1][j]+1,f[i][j-1]+1),f[i-1][j-1]+!(s[i]==a[j]));		
		}
	} 
	return f[ls][la];
}
signed main()
{
	std::cin>>n>>m;
	for(int i=0;i<n;i++) std::cin>>s[i]+1;//给定的字符串
	while(m--)
	{
		char a[N];
		int limit;
		std::cin>>a+1>>limit;
		
		int res=0;
		for(int i=0;i<n;i++)//枚举有几个字符串可以变成询问的 
		{
			if(dis(a,s[i])<=limit) res++;
		}	
		std::cout<<res<<'\n';
	} 
	
	return 0;
} 

区间DP

石子合并

282. 石子合并 - AcWing题库

#include<bits/stdc++.h>
const int N=310;
int n;
int a[N],s[N],f[N][N];
signed main()
{
	std::cin>>n;
	for(int i=1;i<=n;i++)
	{
		std::cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	for(int len=2;len<=n;len++)
	{
		for(int i=1;i+len-1<=n;i++)
		{
			int j=i+len-1;//右端点
			f[i][j]=1e9;
			for(int k=i;k<=j;k++)
			{
				f[i][j]=std::min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);	
			} 
		}
	}
	std::cout<<f[1][n];
	return 0;
} 

计数类DP

整数划分 

900. 整数划分 - AcWing题库

 完全背包
朴素版
#include<bits/stdc++.h>
const int N=1e3+10,mod=1e9+7;
int f[N][N];//f[i][j]表示只从1~i中选,且总和等于j的方案数
signed main()
{
	int n;
	std::cin>>n;
	f[0][0]=1;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			f[i][j]=f[i-1][j];
			if(j>=i) f[i][j]=(f[i-1][j]+f[i][j-i])%mod;
		}
	}
	std::cout<<f[n][n]%mod;
	return 0;
} 
优化版
#include<bits/stdc++.h>
const int N=1e3+10,mod=1e9+7;
int f[N];//f[i][j]表示只从1~i中选,且总和等于j的方案数
signed main()
{
	int n;
	std::cin>>n;
	f[0]=1;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			f[j]=(f[j]+f[j-i])%mod;
		}
	}
	std::cout<<f[n];
	return 0;
}

数位统计DP

计数问题

338. 计数问题 - AcWing题库

#include<bits/stdc++.h>
int get(std::vector<int> nums,int l,int r)
{
	int res=0;
	for(int i=r;i>=l;i--)
	{
		res=res*10+nums[i];
	}
	return res;
}
int count(int n,int x)//1-n中,x出现次数 
{
	if(!n) return 0; 
	std::vector<int> nums;//倒着存数
	while(n)
	{
		nums.push_back(n%10);
		n/=10;
	}//346,643
	n=nums.size();
	int res=0;
	//如果x为0,x不能出现在首位,故而从n-2开始 
	for(int i=n-1-!x;i>=0;i--) //枚举x出现在每位的次数 
	{
		if(i<n-1)//如果当前位不是最高位,计算前面的可能个数 
		{
			res+=get(nums,i+1,n-1)*pow(10,i); //get从低位到高位
			if(!x) res-=pow(10,i);//如果x为0,前面必须从001开始,因此少一种情况 
		} 
		if(nums[i]==x) res+=get(nums,0,i-1)+1; //计算后面的可能 
		else if(nums[i]>x) res+=pow(10,i);
	} 
	return res;
}
signed main()
{
	int a,b;
	while(std::cin>>a>>b,a)
	{
		if(a>b) std::swap(a,b);
		for(int i=0;i<10;i++)
		{
			std::cout<<count(b,i)-count(a-1,i)<<' ';
		}
		std::cout<<'\n';
	}
	
	return 0;
} 

状态压缩DP

蒙德里安的梦想 

291. 蒙德里安的梦想 - AcWing题库

#include<bits/stdc++.h>
const int N=1<<12;//每一列的状态数
bool st[N];//记录合法的列的状态 
#define int long long
std::vector<int> can[N];
int f[12][N];//前i-1列已经填好,且从第i-1列伸到第i列的状态是j 
signed main()
{
	int n,m;	
	while(std::cin>>n>>m,n||m)
	{
		//先预处理出第i-1列的所有合法状态
		//先判断是否合法 
		for(int i=0;i<1<<n;i++)//每一列有n个格子,枚举状态 
		{
			int cnt=0;
			bool ok=true;
			for(int j=0;j<n;j++) 
			{
				if((i>>j)&1)//当前位填了 
				{
					if(cnt%2)//空格数是奇数 
					{
						ok=false;
						break;
					} 
					cnt=0; //归0 
				}else{
					cnt++;
				}
			}
			if(cnt%2) ok=false;
			st[i]=ok;
		} 
		memset(can,0,sizeof can);
		//预处理出所有第i列前一列的可能状态
		for(int i=0;i<1<<n;i++)//枚举这一列的状态 
		{
			for(int j=0;j<1<<n;j++)//前一列的状态 
			{
				if((i&j)==0&&st[i|j]) //没有冲突且空格数为偶数 
				{
					can[i].push_back(j);	
				} 
			} 
		} 
		memset(f,0,sizeof f);
		f[0][0]=1;
		for(int i=1;i<=m;i++)//枚举每一列 
		{
			for(int j=0;j<1<<n;j++)//这一列的状态 
			{
				for(auto k:can[j])
				{
					f[i][j]+=f[i-1][k]; 
				} 
			}
		} 
		std::cout<<f[m][0]<<'\n';
	}
	
	return 0;
} 

 最短Hamilton路径

91. 最短Hamilton路径 - AcWing题库

#include<bits/stdc++.h>
const int N=1<<20;
int w[25][25],f[N][25];

signed main()
{
	int n;
	std::cin>>n;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			std::cin>>w[i][j];
		}
	}
	memset(f,0x3f,sizeof f);
	f[1][0]=0;
	for(int i=0;i<1<<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if((i>>j)&1)
			{
				for(int k=0;k<n;k++)
				{
					if((i>>k)&1) f[i][j]=std::min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
				}
			}
		}
	}
	std::cout<<f[(1<<n)-1][n-1];
	return 0;
}

树形DP

没有上司的舞会

285. 没有上司的舞会 - AcWing题库

#include<bits/stdc++.h>
const int N=6010;

int f[N][2],happy[N];
bool hasfa[N];
int h[N],ne[N],e[N],idx;
void add(int a,int b)
{
	e[idx]=a,ne[idx]=h[b],h[b]=idx++;
}
void dfs(int u)
{
	f[u][1]=happy[u];
	for(int i=h[u];i!=-1;i=ne[i])
	{
		int j=e[i];
		dfs(j);
		f[u][1]+=f[j][0];
		f[u][0]+=std::max(f[j][0],f[j][1]); 
	}
	
}
signed main()
{
	int n;
	std::cin>>n;
	for(int i=1;i<=n;i++) std::cin>>happy[i];
	memset(h,-1,sizeof h);
	for(int i=1;i<n;i++)
	{
		int a,b;//b是上司
		std::cin>>a>>b;
		add(a,b);
		hasfa[a]=true;	 
	} 
	int root=1;
	while(hasfa[root]) root++;
	dfs(root);
	std::cout<<std::max(f[root][0],f[root][1]);
	return 0;
}

 记忆化搜索

滑雪

901. 滑雪 - AcWing题库

#include<bits/stdc++.h>
const int N=310;
int h[N][N],mem[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m;
int dfs(int x,int y)
{
	int &u=mem[x][y];
	if(u!=-1) return mem[x][y];
	u=1;//至少可以走当前点 
	for(int i=0;i<4;i++)
	{
		int a=x+dx[i],b=y+dy[i];
		if(a>=1&&b>=1&&a<=n&&b<=m&&h[a][b]<h[x][y])
			u=std::max(u,dfs(a,b)+1);
	}
	return u;
}
signed main()
{
	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) std::cin>>h[i][j]; 
	}
	memset(mem,-1,sizeof mem);
	int res=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			res=std::max(res,dfs(i,j));
		}
	}
	std::cout<<res; 
	return 0;
}

完结,撒花~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

穷举法、回溯法、分支界限法解决旅行商(TSP)问题

文章目录 一、问题描述二、穷举法解决2.1 介绍2.2 代码 三、回溯法解决四、分支界限法4.1 介绍4.2 代码 一、问题描述 有一个旅行商由某城市出发&#xff0c;经过所有给定的 n n n 个城市后&#xff0c;再回到出发的城市。除了出发的城市外&#xff0c;其它城市只经过一回。这…

2023.11.19 hadoop之MapReduce

目录 1.简介 2.分布式计算框架-Map Reduce 3.mapreduce的步骤 4.MapReduce底层原理 map阶段 shuffle阶段 reduce阶段 1.简介 Mapreduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于hadoop的数据分析应用”的核心框架&#xff1b; Mapreduce核心功能是…

图解系列--认证

单向散列函数 1.什么是单向散列函数 单向散列函数有一个输入和一个输出&#xff0c;其中输入称为消息&#xff0c;输出称为散列值。单向散列函数可以根据消息的内容计算出散列值&#xff0c;而散列值就可以被用来检查消息的完整性。 在指定的散列函数处理下&#xff0c;无论输…

Hive语法,函数--学习笔记

1&#xff0c;排序处理 1.1cluster by排序 &#xff0c;在Hive中使用order by排序时是全表扫描&#xff0c;且仅使用一个Reduce完成。 在海量数据待排序查询处理时&#xff0c;可以采用【先分桶再排序】的策略提升效率。此时&#xff0c; 就可以使用cluster by语法。 cluster…

支持4KHz回报还能无线充电,简约不简单的雷柏VT3S游戏鼠标上手

这两年国产鼠标的表现很让人惊喜&#xff0c;不仅外观做工越来越精细&#xff0c;配置也越来越强大&#xff0c;当然价格依然亲民。现在很容易找到一款搭载高端传感器、响应速度快、电池续航时间长&#xff0c;并且还支持无线充电的全能型鼠标。 我之前用雷柏的鼠标比较多&…

Java 教育局民办教育信息服务与监管平台

1) 项目背景 按照《中华人民共和国民办教育促进法》和《中华人民共和国政府信息公开条例》的相关规定&#xff0c;为满足学生和家长、社会各界获取权威信息的需求&#xff0c;着力解决服务老百姓最后一公里问题&#xff0c;达到宣传民办教育和引导家长择校的效果&#xff0…

Java Swing商品信息查询系统

内容要求 1&#xff09; 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法&#xff0c;在进行代码编写前要能够设计好自己的算法。 2&#xff09;本次程序设计涉及到 Java 的基本语法&#xff0c;即课堂上所…

3.6-Dockerfile语法梳理及最佳实践

WORKDIR是设置当前docker的工作目录 ADD 和 COPY 为了将本地的一些文件添加到docker image里面&#xff0c;ADD 和 COPY的作用特别像&#xff0c;但是ADD 和 COPY还有一些区别&#xff0c;ADD不仅可以添加本地文件到docker里面&#xff0c;还可以将文件在添加到docker image里面…

Linux进程——system函数、popen函数

system函数&#xff08;执行shell 命令&#xff09; 头文件 #include <stdlib.h> 函数定义 int system(const char * string); 函数说明 system()会调用fork()产生子进程&#xff0c;由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令&#xff0c;…

4.Pod详解【四】

文章目录 4. Pod详解4.1 Pod介绍4.1.1 Pod结构4.1.2 Pod定义 4.2 Pod配置4.2.1 基本配置4.2.2 镜像拉取4.2.3 启动命令4.2.4 环境变量4.2.5 端口设置4.2.6 资源配额 4.3 Pod生命周期4.3.1 创建和终止4.3.2 初始化容器4.3.3 钩子函数4.3.4 容器探测4.3.5 重启策略 4.4 Pod调度4.…

牛客网刷题笔记三 寻找第K大+两数之和+合并两个排序的链表+用两个栈实现队列

算法题牛客网NC88 寻找第K大 题目&#xff1a; 思路就是做个排序&#xff0c;要求时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)&#xff0c;因此选用快排。代码&#xff1a; class Solution:def quickSort(self, a, start, end):if start > end:returnval a[start]…

利用SD存储介质扩展MAXQ20000的非易失性数据存储空间

SD存储卡是一种可移动存储介质&#xff0c;通常用于相机、手机、平板电脑等设备中存储照片、视频、音乐等数据。SD存储卡的全称为Secure Digital Memory Card&#xff0c;是由SD Card Association制定的一种标准格式。它具有体积小、存储容量大、读写速度快、价格低廉等优点。目…

Triage沙箱监控

Triage沙箱可以免费分析恶意软件样本。最先进的恶意软件分析沙箱&#xff0c;具有您需要的所有功能。 在可定制的环境中提交大量样本&#xff0c;并对许多恶意软件系列进行检测和配置提取。立即查看公开报告并对您的恶意软件进行分类&#xff01; 官方网址&#xff1a;https:…

关于链表的几道算法题

1.删除链表的倒数第n个节点 力扣https://leetcode.cn/submissions/detail/482739445/ /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(…

Spring Boot中实现支付宝、微信和银联支付的功能

Spring Boot中实现支付宝、微信和银联支付的功能 在Spring Boot中实现支付宝、微信和银联支付的功能&#xff0c;通常需要使用它们各自的SDK&#xff08;Software Development Kit&#xff09;。以下是一个简单的示例代码&#xff0c;演示了如何在Spring Boot项目中集成支付宝…

22. 深度学习 - 自动求导

Hi&#xff0c;你好。我是茶桁。 咱们接着上节课内容继续讲&#xff0c;我们上节课已经了解了拓朴排序的原理&#xff0c;并且简单的模拟实现了。我们这节课就来开始将其中的内容变成具体的计算过程。 linear, sigmoid和loss这三个函数的值具体该如何计算呢&#xff1f; 我们…

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能

使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能 在使用Spring Boot结合JustAuth实现支付宝、微信、微博扫码登录功能之前&#xff0c;需要先确保已经配置好Spring Boot项目&#xff0c;并且添加了JustAuth的依赖。你可以在项目的pom.xml文件中添加如下依赖&a…

麦克风阵列入门

文章引注&#xff1a; http://t.csdnimg.cn/QP7uC 一、麦克风阵列的定义 所谓麦克风阵列其实就是一个声音采集的系统&#xff0c;该系统使用多个麦克风采集来自于不同空间方向的声音。麦克风按照指定要求排列后&#xff0c;加上相应的算法&#xff08;排列算法&#xff09;就可…

2 Redis的高级数据结构

1、Bitmaps 首先&#xff0c;最经典的应用场景就是用户日活的统计&#xff0c;比如说签到等。 字段串&#xff1a;“dbydc”&#xff0c;根据对应的ASCII表&#xff0c;最后可以得到对应的二进制&#xff0c;如图所示 一个字符占8位&#xff08;bit&#xff09;&#xff0c;…