感觉一个太长了,本来想拆分,拆了三个,但是拆分太累了,就这么发吧
发这玩意要是能和qq空间一样省事就好了
一.复习内容
分治算法 二分查找,归并排序
回溯 01背包,八皇后
分支限界 +1*2平方,电子老鼠闯迷宫
dp贪心 最长公共子序列,最大连续子序列和,活动安排
二.源代码
1.二分查找
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e4 + 10;
int a[N];
int n, m;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
cin >> m;
while(m -- )
{
int k;
scanf("%d", &k);
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(a[mid] >= k) r = mid;
else l = mid + 1;
}
if(a[l] == k) puts("Yes");
else puts("No");
}
return 0;
}
2.归并排序
#include<iostream>
#include<stdio.h>
using namespace std;
const int N = 1e4 + 10;
int n;
int a[N], tmp[N];
void merge_sort(int l, int r)
{
if(l >= r) return;
int mid = l + r >> 1;
merge_sort(l ,mid), merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r)
{
if(a[i] <= a[j]) tmp[k ++ ] = a[i ++ ];
else tmp[k ++ ] = a[j ++ ];
}
while(i <= mid)
tmp[k ++ ] = a[i ++ ];
while(j <= r)
tmp[k ++ ] = a[j ++ ];
for(int i = l, k = 0; i <= r; i ++, k ++ )
a[i] = tmp[k];
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
merge_sort(0, n - 1);
for(int i = 0; i < n; i ++ )
cout << a[i] << endl;
return 0;
}
3.01背包
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int N = 15;
int p[N], w[N], f[N];
int main()
{
int n, c;
while(scanf("%d%d", &n, &c), n || c)
{
memset(f, 0, sizeof f);
for(int i = 1; i <= n; i ++ )
scanf("%d", &w[i]);
for(int i = 1; i <= n; i ++ )
scanf("%d", &p[i]);
for(int i = 1; i <= n; i ++ )
for(int j = c; j >= w[i]; j -- )
f[j] = max(f[j], f[j - w[i]] + p[i]);
cout << f[c] << endl;
}
return 0;
}
4.八皇后
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10, M = 2 * N;
bool col[N], dg[M], udg[M];
char g[N][N];
int cnt;
void dfs(int u)
{
if(u >= 8)
{
cnt ++;
cout << "No " << cnt << ":"<< endl;
for(int i = 0; i < 8; i ++ )
puts(g[i]);
return;
}
for(int i = 0; i < 8; i ++ )
if(!col[i] && !dg[u + i] && !udg[8 - i + u])
{
col[i] = dg[u + i] = udg[8 - i + u] = 1;
g[u][i] = 'A';
dfs(u + 1);
g[u][i] = '.';
col[i] = dg[u + i] = udg[8 - i + u] = 0;
}
}
int main()
{
for(int i = 0; i < 8; i ++ )
for(int j = 0; j < 8; j ++ )
g[i][j] = '.';
dfs(0);
return 0;
}
5.加一乘二平方
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 10010;
int step[N];
int m, n;
void bfs()
{
memset(step, -1, sizeof step);
step[m] = 0;
queue<int> q;
q.push(m);
while(q.size())
{
if(step[n] != -1) return;
int t = q.front();
q.pop();
if(t + 1 <= n && step[t + 1] == -1)
{
q.push(t + 1);
step[t + 1] = step[t] + 1;
}
if(t * 2 <= n && step[t * 2] == -1)
{
q.push(t * 2);
step[t * 2] = step[t] + 1;
}
if(t * t <= n && step[t * t] == -1)
{
q.push(t * t);
step[t * t] = step[t] + 1;
}
}
}
int main()
{
cin >> m >> n;
bfs();
cout << step[n] << endl;
return 0;
}
6.电子老鼠闯迷宫
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct state {int x, y;};
const int N = 15, INF = 1e9;
int d[N][N];
state in, out;
void bfs()
{
queue<state> q;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
q.push(in);
d[in.x][in.y] = 0;
while(q.size())
{
if(d[out.x][out.y] != -1)
return;
state t = q.front();
q.pop();
for(int i = 0; i < 4; i ++ )
{
int x = t.x + dx[i], y = t.y + dy[i];
if(x > 0 && x <= 12 && y > 0 && y <= 12 && d[x][y] == -1)
{
d[x][y] = d[t.x][t.y] + 1;
state tmp;
tmp.x = x, tmp.y = y;
q.push(tmp);
}
}
}
}
int main()
{
cin >> in.x >> in.y >> out.x >> out.y;
memset(d, -1, sizeof d);
for(int i = 1; i <= 12; i ++ )
for(int j = 1; j <= 12; j ++ )
{
char c;
cin >> c;
if(c == 'X') d[i][j] = -INF;
}
bfs();
cout << d[out.x][out.y] << endl;
return 0;
}
7.最长公共子序列
(2条消息) 西工大算法设计与分析 1041最长公共子序列(实验四)_m0_56192195的博客-CSDN博客
8.最大连续子序列和
(2条消息) 西工大算法设计与分析 noj1576 最大连续子序列和问题(实验四)_m0_56192195的博客-CSDN博客
9.活动安排