蓝桥杯——19

学习视频:22-动态规划入门视频讲解_哔哩哔哩_bilibili

动态规划入门:

#include<iostream>

using namespace std;

int main() {

int f[100];

f[1] = 1;

f[2] = 1;

int n;

cin >> n;

for (int i = 3; i <= n; i++) {

f[i] = f[i - 1] + f[i - 2];

}

cout << f[n];

return 0;

}

Q:错排

#include<iostream>

using namespace std;

int main() {

int f[100];

f[1] = 0;

f[2] = 1;

int n;

cin >> n;

for (int i = 3; i <= n; i++) {

f[i] = (n - 1) * f[n - 1] + (n - 1) * f[n - 2];

}

cout << f[n];

return 0;

}

错排公式

f[i] = (n - 1) * f[n - 1] + (n - 1) * f[n - 2]

Q:斐波那契

#include<iostream>

using namespace std;

int main() {

int f[100];

f[1] = 0;

f[2] = 1;

int n;

cin >> n;

f[0] = f[1] = 1;

for (int i = 2; i <= n; i++) {

f[i] = f[i - 1] + f[i - 2];

}

cout << f[n];

return 0;

}

Q:杨辉三角

递推公式:

f[i][j] = f[i - 1][j] + f[i - 1][j - 1] ;
#include<iostream>

using namespace std;

int f[20][20];

void init() {

for (int i = 1; i < 20; i++) {

for (int j = 1; j < 20; j++) {

if (j == 1) {

f[i][j] = 1;

}

else {

f[i][j] = f[i - 1][j - 1] + f[i - 1][j];

}

}

}

}

int main() {

init();

int n, m;

cin >> n >> m;

//输出 第i行 第j列

cout << "该位置的数字是:" << f[n][m] << endl;

//输出杨辉三角

for (int i = 1; i <= n; i++) {

for (int ii = 0; ii < n - i; ii++) {

cout << " ";

}

for (int j = 1; j <= i; j++) {

cout << f[i][j] << " ";

}

cout << '\n';

}

return 0;

}

Q:

#include<iostream>

#include<string>

using namespace std;

int f[30][30];

//记录马的位置

int mx, my;

//标记不能走的点

int map[30][30];

//标记马四周的位置

int dx[8] = {1,1,-1,-1,2,2,-2,-2};

int dy[8] = {-2,2,2,-2,1,-1,1,-1};

int n,m;

int main() {

cin >> n >> m >> mx >> my;

//初始化map

for (int i = 0; i <= n; i++) {

for (int j = 0; j <= m; j++) {

f[i][j] = 0;

map[i][j] = 1;

}

}

for (int i = 0; i < 8; i++) {

int fx = mx + dx[i];

int fy = my + dy[i];

if (fx >= 0 && fx <= n && fy >= 0 && fy <= m) {

map[fx][fy] = 0;

}

}

map[mx][my] = 0;

//递推公式:f[i][j] = f[i-1][j] + f[i][j-1]

f[0][0] = 1;

for (int i = 0; i <= n; i++) {

for (int j = 0; j <= m; j++) {

if (map[i][j] != 0) {

if (i != 0 && map[i-1][j] != 0) {

f[i][j] += f[i - 1][j];

}

if (j != 0 && map[i][j - 1] != 0) {

f[i][j] += f[i][j - 1];

}

}

}

}

cout << f[n][m];

return 0;

}

Q:

#include<iostream>

using namespace std;

int main() {

//递归公式: f[i][j] = min(f[i][j-1],f[i+1][j]) + map[i][j]

int f[5][5];

int map[5][5];

//初始化

int n;

cin >> n;

for (int i = 0; i < n; i++) {

for (int j = 0; j < n; j++) {

cin >> map[i][j];

f[i][j] = 1000;

}

}

int min = 1000;

f[n - 1][0] = 0;

for (int i = n - 1; i >= 0; i--) {

for (int j = 0; j < n; j++) {

if (i != n - 1) {

int tmp = f[i + 1][j] + map[i][j];

if (tmp < f[i][j])

f[i][j] = tmp;

}

if (j != 0) {

int tmp = f[i][j - 1] + map[i][j];

if (tmp < f[i][j])

f[i][j] = tmp;

}

}

}

cout << f[0][n - 1];

return 0;

}

Q:实现捡水果

#include<iostream>

#include<math.h>

using namespace std;

int main() {

int n;

int f[10][10];

int map[10][10];

cin >> n;

for (int i = 1; i <= n; i++) {

for (int j = 1; j <= i; j++) {

cin >> map[i][j];

f[i][j] = 0;

}

}

//状态转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-1])+map[i][j]

f[1][1] = map[1][1];

for (int i = 1; i <= n; i++) {

for (int j = 1; j <= i; j++) {

if (i == 1 && j == 1) continue;

//只有右上角

else if (j == 1) {

f[i][j] = f[i - 1][j] + map[i][j];

}

//只有左上角

else if (j == i) {

f[i][j] = f[i - 1][j - 1] + map[i][j];

}

//都有

else {

if (f[i - 1][j] > f[i - 1][j - 1])

f[i][j] = f[i - 1][j] + map[i][j];

else

f[i][j] = f[i - 1][j - 1] + map[i][j];

}

}

}

cout << '\n';

int maxn = 0;

for (int i = 1; i <= n; i++) {

if (f[n][i] > maxn)

maxn = f[n][i];

}

cout << maxn;

return 0;

}

/*

4

3

1 2

6 2 3

3 5 4 1

*/

多维状态转移方程

Q:

#include<iostream>

#include<math.h>

using namespace std;

int f[100][100][100];

int main() {

int x, y, z;

cin >> x >> y >> z;

for (int i = 0; i <= x; i++) {

for (int j = 0; j <= y; j++) {

for (int k = 0; k <= z; k++) {

cin >> f[i][j][k];

}

}

}

int inf = 10000;

for (int i = 0; i <= x; i++) {

for (int j = 0; j <= y; j++) {

for (int k = 0; k <= z; k++) {

int mi = inf;

if (i != 0)

mi = min(mi, f[i - 1][j][k]);

if (j != 0)

mi = min(mi, f[i][j - 1][k]);

if (k != 0)

mi = min(mi, f[i][j][k - 1]);

if (mi != inf)

f[i][j][k] += mi;

}

}

}

cout << f[x][y][z];

return 0;

}

/*

2 2 2

1 2 3

4 5 6

7 8 9

1 2 3

4 5 6

7 8 9

1 2 3

4 5 6

7 8 9

*/


蓝桥杯已经考完好几天了,在考场上写了一坨shi,但是决定继续看完学习视频!!

f i g h t i n g ! ! ! ! ! ! !

------------------2024.4.12------

现在是2026/3/16救命!其实已经好久没有学习这一块了哈哈哈,我真是服了我自己了!

相关推荐
独自破碎E2 小时前
【面试真题拆解】Redis的8种内存淘汰策略
redis·面试·职场和发展
badhope2 小时前
C语言二级考点全解析与真题精讲
c语言·开发语言·c++·人工智能·python·microsoft·职场和发展
逆境不可逃4 小时前
【从零入门23种设计模式18】行为型之备忘录模式
服务器·数据库·设计模式·oracle·职场和发展·迭代器模式·备忘录模式
愚者游世4 小时前
alignof 和 alignas各版本异同
c++·学习·程序人生·职场和发展·visual studio
卡梅德生物科技4 小时前
卡梅德生物科普:CD140a(PDGFRα)靶点深度解析:机制、药物研发与未来趋势
大数据·人工智能·面试·职场和发展·学习方法
仰泳的熊猫5 小时前
题目2281:蓝桥杯2018年第九届真题-次数差
数据结构·c++·算法·蓝桥杯
TracyCoder1235 小时前
LeetCode Hot100(70/100)—— 322. 零钱兑换
算法·leetcode·职场和发展
x_xbx6 小时前
LeetCode:88. 合并两个有序数组
算法·leetcode·职场和发展
alphaTao6 小时前
LeetCode 每日一题 2026/3/9-2026/3/15
算法·leetcode·职场和发展