学习视频: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救命!其实已经好久没有学习这一块了哈哈哈,我真是服了我自己了!