必须掌握 必须掌握 必须掌握:
-
排序算法:
-
搜索算法:
-
字符串处理算法:
-
图算法:
- 最短路径算法(如 Dijkstra 算法、Floyd-Warshall 算法)
- 最小生成树算法(如 Prim 算法、Kruskal 算法、SPFA 算法)
- 拓扑排序算法
- 深度优先搜索(DFS)和 广度优先搜索(BFS))
- 前序中序后序
- 队列
-
动态规划算法:
-
贪心算法:
01背包
二维:
二维:
二维:
#include<bits/stdc++.h>
using namespace std;
int n,v,c[1005],w[1005],f[1005][1005];
int main()
{
cin >> n >> v;
for (int i = 1; i <= n; i++)
cin >> c[i] >> w[i];
for (int i = 1; i <= n; i++)
f[i][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= v; j++)
if (j >= w[i])
f[i][j] = max(f[i - 1][j - w[i]] + c[i], f[i - 1][j]);
else
f[i][j] = f[i - 1][j];
cout << f[n][v] << endl;
return 0;
}
一维: 一维: 一维:
#include<bits/stdc++.h>
using namespace std;
int w[105],v[105];
int dp[20002];
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=m;i++)
{
cin >> w[i] >> v[i];
for(int j=n;j>=1;j--)
{
if(w[i] > j)
{
dp[j] = dp[j];
}
else if(w[i] <= j)
{
dp[j] = max(v[i] + dp[j - w[i]],dp[j]);
}
}
}
cout<<dp[n];
return 0;
}
搜索:
搜索:
搜索:
广搜(
b
f
s
)
广搜(bfs)
广搜(bfs):
#include<iostream>
using namespace std;
struct point
{
int x,y,step;
};
point p[2505];
int check[55][55],zhang[55][55];
int dis[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
int n,m,t,ex,ey;
cin >> n >> m >> t >> ex >> ey;
for(int i=1;i<=t;i++)
{
int zx,zy;
cin >> zx >> zy;
zhang[zx][zy] = 1;
}
int head = 1,tail = 1;
p[tail].x = 1,p[tail].y = 1,p[tail].step = 0;
tail++;
check[1][1] = 1;
while(head < tail)
{
int disx,disy;
for(int i=0;i<4;i++)
{
disx = p[head].x + dis[i][0];
disy = p[head].y + dis[i][1];
if(disx < 1 || disy > n || disy < 1 || disy > m)
{
continue;
}
if(check[disx][disy] == 0 && zhang[disx][disy] == 0)
{
p[tail].x = disx;
p[tail].y = disy;
p[tail].step = p[head].step + 1;
tail++;
check[disx][disy] = 1;
if(disx == ex && disy == ey)
{
cout << p[tail-1].step << endl;
return 0;
}
}
}
head++;
}
return 0;
}
样例: 4 4 3 2 2 2 2 3 2
输出:4
深搜:
深搜:
深搜:
深度搜索题单
#include <bits/stdc++.h>
using namespace std;
int n,len = 1,f[5003][5003];
void hp(int k)
{
int i;
for(i=1;i<=len;i++)
{
f[k][i] = f[k-1][i] + f[k-2][i];
}
for(i=1;i<=len;i++)
{
if(f[k][i] >= 10)
{
f[k][i+1] += f[k][i] / 10;
f[k][i] = f[k][i] % 10;
if(f[k][len+1])
{
len++;
}
}
}
}
int main()
{
int i;
cin >> n;
f[1][1]=1;
f[2][1]=2;
for(i=3;i<=n;i++)
{
hp(i);
}
for(i=len;i>=1;i--)
{
cout << f[n][i];
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m,a[11];
bool u[11];
void dfs(int p)
{
if(p == m)
{
for(int i=1;i<=m;i++)
{
cout << a[i] << " ";
}
cout << endl;
return;
}
for(int i=1;i<=n;i++)
{
if(u[i])
{
continue;
}
u[i] = 1;
p++;
a[p] = i;
dfs(p);
u[i] = 0;
p--;
}
}
int main()
{
cin >> n >> m;
dfs(0);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
bool f[15];
int n;
void dfs(int x)
{
if(x == n)
{
for(int i=0;i<n;i++)
{
if(f[i])
{
cout << "Y";
}
else
{
cout << "N";
}
}
cout << endl;
return;
}
for(int i=0;i<2;i++)
{
f[x] = i;
dfs(x+1);
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int r,a[100],n;
void dfs(int k){
int i;
if(k>r){
for(i=1;i<=r;i++){
cout<<setw(3)<<a[i];
}
cout<<endl;
return ;
}
for(i=a[k-1]+1;i<=n;i++){
a[k]=i;
dfs(k+1);
}
}
int main()
{
cin>>n>>r;
dfs(1);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,w[100],ok[100];
void dfs(int pos)
{
if(pos==n)
{
for(int i=1;i<=n;i++)
{
cout << setw(5) << ok[i];
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(!w[i])
{
w[i]=1;
ok[pos+1]=i;
dfs(pos+1);
w[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
完全背包 完全背包 完全背包
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5;
int weight[N];
int value[N];
int n;
int bagweight = 4;
int dp[5];
int main() {
cin >> n ;
for (int i = 0; i < n; i++) {
cin >> weight[i];
}
for (int j = 0; j < n; j++) {
cin >> value[j];
}
for (int i = 0; i < n; i++) {
for (int j = weight[i]; j < bagweight; j++) {
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
cout << dp[bagweight];
return 0;
}
排序:
排序:
排序:
冒泡
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100005];
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
bool flag=true;
while(flag){
flag=false;
for(int i=1;i<n;i++){
if(a[i]>a[i+1]){
flag=true;
swap(a[i],a[i+1]);
}
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
return 0;
}
选择
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100005];
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
int x=i;
for(int j=i+1;j<=n;j++){
if(a[j]<a[x]){
x=j;
}
}
swap(a[i],a[x]);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
return 0;
}
插入
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int x=a[i];
int j=i-1;
while(j>=0 and a[j]>x){
a[j+1]=a[j];
j--;
}
a[j+1]=x;
}
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
return 0;
}
希尔
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int a[10]={10,9,8,7,6,5,4,3,2,1};
for(double i=10;i>1;){
i=round(i/2);
for(int j=0;j+i<10;j++){
if(a[j]>a[j+(int)i]){
swap(a[j],a[j+(int)i]);
}
}
}
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
return 0;
}
快排
#include<iostream>
using namespace std;
int n,a[100005];
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
void sort(int a[],int l,int r){
int i=l,j=r,flag=a[(l+r)/2];
do{
while(a[i]<flag){
i++;
}
while(a[j]>flag){
j--;
}
if(i<=j){
swap(a[i],a[j]);
i++;
j--;
}
}while(i<=j);
if(l<j){
sort(a,l,j);
}
if(i<r){
sort(a,i,r);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,0,n-1);
for(int i=0;i<n;i++){
cout<<a[i]<<' ';
}
return 0;
}
桶
#include<iostream>
using namespace std;
int n,b[100000005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
b[x]++;
}
for(int i=1;i<=100000000;i++){
for(int j=1;j<=b[i];j++){
cout<<i<<' ';
}
}
return 0;
}
STL(排序)
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
return 0;
}
Kruskal (最小生成树) 算法:
#include<bits/stdc++.h>
using namespace std;
int n,m,fa[200010],tot;
struct edge
{
int x,y,z;
}e[200010];
int find(int x)
{
if(fa[x] == x)
{
return x;
}
fa[x] = find(fa[x]);
return fa[x];
}
bool cmp(edge a ,edge b)
{
return a.z < b.z ;
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++)
{
fa[i] = i;
}
for(int i=1;i<=m;i++)
{
cin >> e[i].x >> e[i].y >> e[i].z;
}
sort(e + 1, e + 1 + m, cmp);
int cnt = 0,sum = 0;
for(int i=1;i<=m;i++)
{
int fx = find(e[i].x);
int fy = find(e[i].y);
if(fx!=fy)
{
fa[fy] = fx;
sum += e[i].z;
cnt++;
if(cnt == n-1)
{
break;
}
}
}
if(cnt >= n-1)
{
cout << sum;
}
else
{
cout << "No Answer";
}
return 0;
}
前缀和:
//一维
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1000010],s[1000010];
ll t=0;
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-1]+a[i];
}
for(int i=k;i<n;i++)
t=max(t,s[i]-s[i-k]);//传送器传送最大距离
if(k>=n)
cout<<0<<endl;
else
cout<<s[n-1]-t<<endl;
return 0;
}
//二维
#include<bits/stdc++.h>
using namespace std;
int a[5005][5005];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x,y,v;
cin>>x>>y>>v;
a[x+1][y+1]=v;//矩阵整体右移
}
for(int i=1;i<=5001;i++)
{
for(int j=1;j<=5001;j++)
{
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j];
}
}
int ans=0;
for(int i=m;i<=5001;i++)
{
for(int j=m;j<=5001;j++)
{
int t=a[i][j]-a[i-m][j]-a[i][j-m]+a[i-m][j-m];
ans=max(ans,t);//更新答案
}
}
cout<<ans<<endl;
return 0;
}