普通
A12NCH3N
Write the code,change the world.
展开
-
DP(最长上升子序列)——腾讯校招题:逛街
l[i]表示从左到右以楼i结尾的最长下降子序列的长度,在楼i往左看,看到最多的楼的数量就是l[i-1]r[i]表示同理,在楼i往右看,以楼i+1为起点的最长上升子序列的长度就是能看到最多的楼的数量。最后吧两个加起来并加上楼i自身的1,就是答案。#include<bits/stdc++.h>using namespace std;const int N=100010;int w[N],l[N],r[N];int main(){ int n; cin>>n; .原创 2022-04-22 00:06:35 · 369 阅读 · 0 评论 -
Dijkstra堆优化版模板
#include<bits/stdc++.h>using namespace std;const int N=40;int mp[N][N];int dist[N],st[N];int n,k;typedef pair<int,int> PII;void dijkstra(int kk){ memset(dist,0x3f,sizeof(dist)); priority_queue<PII,vector<PII>,greater<原创 2022-04-09 00:19:00 · 414 阅读 · 0 评论 -
SPFA模板题
#include<iostream>#include<cstring>#include<queue>using namespace std;const int N=1000010;int n,m,start,ed,idx;int e[N],h[N],ne[N],w[N];int dist[N],st[N];void add(int a,int b,int c){ e[idx]=b,w[idx]=c;ne[idx]=h[a],h[a]=idx+..原创 2022-04-08 20:31:34 · 502 阅读 · 0 评论 -
DP+DFS——最大值路径
dp算出最大值后,搜索所有路径,走到终点时的值等于最大值则方案数+1#include<iostream>using namespace std;const int N=20;int n,ans,maxn;int dp[N][N];int w[N][N];void dfs(int h,int l,int count){ if(h<1||l<1||h>n||l>n) return; if(count==maxn) {..原创 2022-04-08 14:16:25 · 324 阅读 · 0 评论 -
DP(01背包)+离散化——网格贪吃蛇
蓝桥杯 试题 算法提高 网格贪吃蛇(C++)离散化的步骤:排序,去重得到的序列中元素的位置就是离散化后的坐标。例如(2,5) (1000,500) (1000, 999)先将所有数字放入数组中并排序去重得到:2,5,500,999,1000离散化后的坐标就是(1,2) (5,3) (5,4)该题中地图很大,无法开这么大的二维数组。但实际给出的点就1000个点,所以需要进行离散化。注意,虽然只有1000个点,但却有2000个数,所以N要定到2000以上。参考文章:#include&..原创 2022-04-07 23:13:28 · 565 阅读 · 0 评论 -
状态机DP——秘密行动
0表示爬,1表示跳,不能连续跳2次,因此1的状态只能由0转移过来。#include<bits/stdc++.h>using namespace std;const int N=10010;int dp[N][2],w[N];int main(){ int n; cin>>n; for(int i=2;i<=n+1;i++) cin>>w[i]; //dp[0][0]=dp[0][1]=0; for.原创 2022-04-06 23:44:07 · 183 阅读 · 0 评论 -
DP——最大连续子序列的和
s 表示以 i-1 这个数为结尾的最大连续子序列的和。ans表示以 i 这个数为结尾的最大连续子序列的和。当s≤0,s+w[i]不会变大,因此舍弃前面的子序列和,s置零否则s加上当前数w[i]#include<bits/stdc++.h>using namespace std;const int N=100010;int w[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++..原创 2022-04-06 23:32:47 · 158 阅读 · 0 评论 -
自写全排列函数——递归实现排列型枚举
参考:全排列函数和自写排列#include<bits/stdc++.h>using namespace std;const int N=10;int a[]={1,2,3,4,5,6,7,8,9};int ans[N],st[N];int n;void dfs(int start,int ed){ if(start==ed) { for(int i=0;i<n;i++) cout<<ans[i]<.原创 2022-03-30 23:52:18 · 123 阅读 · 0 评论 -
DP——背包问题求具体方案
#include<bits/stdc++.h>using namespace std;const int N=1010;int v[N],w[N],dp[N][N];int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=n;i>0;i--) { ..原创 2022-03-29 21:43:34 · 118 阅读 · 0 评论 -
BFS(A*)——八数码
相当于滑块拼图游戏#include<bits/stdc++.h>using namespace std;int evaluate(string now){ int value=0; for(int i=0;i<now.size();i++) { if(now[i]!='x') { int t=now[i]-'1'; value+=abs(i/3-t/3)+abs(i%3-t..原创 2022-03-28 23:04:14 · 3824 阅读 · 0 评论 -
DP(多重背包问题)——庆功会
时间复杂度为O(nms)数据量为3kw无需优化#include<bits/stdc++.h>using namespace std;const int N=6010;int dp[N];int n,m;int main(){ cin>>n>>m; for(int i=1;i<=n;i++) { int v,w,s; cin>>v>>w>>s; .原创 2022-03-28 00:41:37 · 312 阅读 · 0 评论 -
DP(01背包)——数字组合
二维数组:#include<bits/stdc++.h>using namespace std;const int N=110,M=10010;int dp[N][M];int a[N];int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; dp[0][0]=1; for(int i=1;i<.原创 2022-03-27 21:33:18 · 84 阅读 · 0 评论 -
Dijkstra——最小花费
#include<bits/stdc++.h>using namespace std;const int N=2010;double g[N][N];double dist[N];int st[N];int n,m,a,b;void dijkstra(){ //memset(dist,0,sizeof(dist)); dist[a]=1; for(int i=1;i<=n;i++) { int t=-1; ..原创 2022-03-27 18:53:50 · 354 阅读 · 0 评论 -
BFS——山峰和山谷
#include<iostream>#include<algorithm>#include<queue>using namespace std;const int N=1010;typedef pair<int,int> PII;int mp[N][N],st[N][N];int n;int peak,valley;void bfs(int h,int l){ queue<PII> q; q.push({...原创 2022-03-27 14:03:25 · 473 阅读 · 0 评论 -
单源最短路(用floyd算法)——信使
#include<bits/stdc++.h>using namespace std;int n,m;const int N=110;int dist[N][N];int main(){ memset(dist,0x3f,sizeof(dist)); cin>>n>>m; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b&g..原创 2022-03-26 00:11:53 · 320 阅读 · 0 评论 -
BFS——池塘计数
#include<bits/stdc++.h>using namespace std;#define x first#define y secondconst int N=1010;char mp[N][N];int ans=0;int n,m;typedef pair<int,int> PII;void bfs(int h,int l){ queue<PII> q; q.push({h,l}); mp[h][l]='.';.原创 2022-03-24 01:04:47 · 201 阅读 · 0 评论 -
最小步数模型的BFS——魔板
#include<bits/stdc++.h>using namespace std;map<string,int> dist;map<string,pair<char,string> >pre;string moveA(string t){ reverse(t.begin(),t.end()); return t;}string moveB(string t){ string str=""; str+=t..原创 2022-03-21 13:43:09 · 120 阅读 · 0 评论 -
计数DP——瓜瓜打游戏(EASY)
#include<bits/stdc++.h>using namespace std;const int N=5010;long long dp[N][N];//dp[i][j]代表过了i关获得j个徽章的路径数int m[N];int main(){ int n,p; cin>>n>>p; for(int i=1;i<=n;i++) cin>>m[i]; dp[0][0]=1; for.原创 2022-03-20 14:39:50 · 4213 阅读 · 0 评论 -
筛质数——哥德巴赫猜想
#include<bits/stdc++.h>using namespace std;const int N=1000010;int primes[N],cnt;bool visited[N];//false为没有被筛掉,是质数。void get_primes(int n){ for(int i=2;i<=n;i++) { if(visited[i]==false) primes[cnt++]=i; for(int j=0;..原创 2022-03-18 19:51:11 · 187 阅读 · 0 评论 -
拓扑DP——来自wzc的简单拓扑dp
#include<bits/stdc++.h>using namespace std;const int N=100010,M=200010;int n,m;int dp[N];int h[N],e[M],ne[M],v[N],idx;int d[N];void add(int a,int b){ e[++idx]=b; ne[idx]=h[a]; h[a]=idx;}void topsort(){ queue<int> que.原创 2022-03-18 17:04:53 · 336 阅读 · 0 评论 -
拓扑排序(数组模拟邻接表)——家谱树
第一次用数组模拟单链表,注释和下图就是我的全部理解参考:数组模拟邻接表-头插法(C++)#include<bits/stdc++.h>using namespace std;const int N=110,M=N*N/2;int n;int h[N],e[M],ne[M],idx;/*h是表头数组,存储顶点i最后插入的一条边的序号。(注:这里采用头插法,这条边相当于使用邻接表时,位于该单链表的第一个结点)e是终点数组,存储i号边指向的顶点ne是指针数组,存储i号边指向的.原创 2022-03-18 14:22:55 · 557 阅读 · 0 评论 -
DP——二维费用的背包问题
#include<bits/stdc++.h>using namespace std;const int V=110,M=110;int dp[V][M];int main(){ int n,v,m; cin>>n>>v>>m; for(int i=1;i<=n;i++) { int a,b,c; cin>>a>>b>>c; f.原创 2022-03-17 16:18:21 · 94 阅读 · 0 评论 -
DP(二维花费01背包)——宠物小精灵之收服
#include<bits/stdc++.h>using namespace std;const int N=1010,M=510;int dp[N][M];int main(){ int n,m,k; cin>>n>>m>>k; for(int p=1;p<=k;p++) { int c1,c2; cin>>c1>>c2; for(in..原创 2022-03-16 17:59:13 · 143 阅读 · 0 评论 -
DP(01背包)——装箱问题
#include<bits/stdc++.h>using namespace std;const int N=20010;int dp[N],m[N];int main(){ int v,n; cin>>v>>n; for(int i=1;i<=n;i++) { int k; cin>>k; for(int j=v;j>=k;j--) .原创 2022-03-16 16:57:16 · 197 阅读 · 0 评论 -
DP(01背包)——采药
#include<bits/stdc++.h>using namespace std;const int N=1010;int dp[N];int main(){ int T,M; cin>>T>>M; for(int i=1;i<=M;i++) { int t,v; cin>>t>>v; for(int j=T;j>=t;j--) .原创 2022-03-16 16:33:56 · 618 阅读 · 0 评论 -
DP(最长上升子序列)——拦截导弹
求最少配备的系统数等价于求最长不上升子序列的最少个数。也等价于原序列的最长上升子序列的长度。证明见《算法竞赛入门到进阶》第130页#include<bits/stdc++.h>using namespace std;const int N=2000;int h[N],f[N];int n;int LIS(){ int ans=1; int dp[N]; for(int i=1;i<=n;i++) { dp[i]=1; .原创 2022-03-16 15:03:05 · 115 阅读 · 0 评论 -
DP——最大上升子序列和
#include<bits/stdc++.h>using namespace std;const int N=1010;int m[N],dp[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>m[i]; int ans=0; for(int i=1;i<=n;i++) { dp[i]=m[i]; .原创 2022-03-15 19:49:26 · 60 阅读 · 0 评论 -
DP(最长上升子序列)——友好城市
#include<bits/stdc++.h>using namespace std;const int N=6000;pair<int,int> m[N];int dp[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>m[i].first>>m[i].second; sort(m+1,m+n+1); int.原创 2022-03-15 19:39:52 · 221 阅读 · 0 评论 -
DP(最长上升子序列)——登山
#include<bits/stdc++.h>using namespace std;const int N=1010;int m[N];int l[N],r[N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) cin>>m[i]; for(int i=1;i<=n;i++) { l[i]=1; .原创 2022-03-15 18:45:36 · 79 阅读 · 0 评论 -
DP(最长上升子序列)——怪盗基德的滑翔翼
#include<bits/stdc++.h>using namespace std;const int N=110;int w[N],dp[N];int main(){ int k; cin>>k; while(k--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>w[i]; ..原创 2022-03-15 17:17:05 · 156 阅读 · 0 评论 -
DP——方格取数
#include<bits/stdc++.h>using namespace std;const int N=11;int m[N][N];int dp[2*N][N][N];int main(){ int n; cin>>n; int a,b,c; while(cin>>a>>b>>c && (a||b||c)) { m[a][b]=c; } ..原创 2022-03-14 20:27:29 · 172 阅读 · 0 评论 -
DP——摘花生
#include<bits/stdc++.h>using namespace std;const int N=110;int m[N][N];int dp[N][N];int main(){ int t; cin>>t; while(t--) { int h,l; cin>>h>>l; for(int i=1;i<=h;i++) for..原创 2022-03-14 17:24:33 · 298 阅读 · 0 评论 -
DP——数字三角形
#include<bits/stdc++.h>using namespace std;const int N=510;int t[N][N];int dp[N][N];int main(){ int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>t[i][j]; for(int i=1;i&l.原创 2022-03-14 17:10:45 · 66 阅读 · 0 评论 -
二维前缀和——激光炸弹
#include<bits/stdc++.h>using namespace std;const int maxn=5002;int s[maxn][maxn];int main(){ int n,r; cin>>n>>r; r=min(r,maxn-1); for(int i=0;i<n;i++) { int x,y,w; cin>>x>>y>>..原创 2022-03-12 21:58:29 · 421 阅读 · 0 评论 -
快速幂+位运算——64位整数乘法
#include<bits/stdc++.h>using namespace std;long long slowMul(long long a,long long b,long long p){ long long ans=0; while(b) { if(b&1)ans=(ans+a)%p; a=a*2%p; b>>=1; } return ans;}int main().原创 2022-03-12 19:17:44 · 242 阅读 · 0 评论 -
并查集+01背包——搭配购买
#include<bits/stdc++.h>using namespace std;const int maxn=10010;int s[maxn];int dp[maxn];int c[maxn],d[maxn];int find_set(int x){ if(s[x]!=x)s[x]=find_set(s[x]); return s[x];}void union_set(int x,int y){ x=find_set(x); y=fi.原创 2022-03-11 15:38:37 · 253 阅读 · 0 评论 -
并查集——格子游戏
#include<bits/stdc++.h>using namespace std;const int maxn=40010;int s[maxn];int n,m;void init_set(){ for(int i=0;i<=maxn;i++) s[i]=i;}int get(int x,int y){ return x*n+y;}int find_set(int x){ if(s[x]!=x)s[x]=find_set(..原创 2022-03-11 14:20:48 · 5157 阅读 · 0 评论 -
C语言——输入一个整数(n),求1+2+3+……+n的值
输入一个数(n),该函数返回1+2+3+……n的值int sum (int n){ if(n==1) return 1; else return (sum(n-1)+n);}原创 2020-01-14 22:26:45 · 8757 阅读 · 0 评论