时间:2021/2/21
测试练习
阶乘计算(蓝桥杯 基础练习)
高精度乘法
- 将字符形式的值转化成真实的值(此题中省略这一步),按输入的逆序存入容器A,这样可以保证数组的低下标存放据的低位
- 从大数A的第0位开始乘小数b,得到的结果加上之前的进位,模10存入容器C,并产生新的进位
- 容器C中的数字逆序输出,即为结果
#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int> A, int b){
vector<int> B;
int t = 0;
for(int i = 0; i < A.size() || t; i ++ ){
//A中的每一位数都乘b
if(i < A.size()) t += A[i] * b;
B.push_back(t % 10);
t /= 10;
}
while(B.size() > 1 && B.back() == 0) B.pop_back();
return B;
}
int main(){
vector<int> A;
A.push_back(1);
int n;
cin >> n;
for(int i = 2; i <= n; i ++ )
A = mul(A, i);
for(int i = A.size() - 1; i >= 0; i -- )
printf("%d", A[i]);
return 0;
}
视频学习
蓝桥杯训练营(C++) 12.1 动态规划入门视频讲解
动态规划最重要的是状态和状态转移方程,注意边界值的特判
- <一维递推> 错排
-
前n封信错排记为F(n)
-
1.从F(n – 1) 中拿一封信和n交换,前n – 1封还是错排 (n – 1种)
-
2.前n -1 中有一封放对,和第n封交换,则前n封错排 (n – 2种)
-
F(n) = (F(n – 1) * F(n – 2)) * (n – 1)
空间优化(一般用不到):
ll a = 0, b = 1, c = 1;
for(int i = 3; i <= n; i ++)
c = (a + b) * (i – 1), a = b, b = c;
- <二维递推>
杨辉三角(算组合数)
f[i][j] = f[i – 1][j – 1] + f[i – 1][j]
过河卒
过河卒(洛谷)
#include<iostream>
using namespace std;
const int N = 30;
long long g[N][N];
//开int型数组过不了
//n = 20, m = 20时,若没有障碍点, 有137846528820种走法
int cx[8] = {-1, -2, -2, -1, 1, 2, 2, 1};
int cy[8] = {2, 1, -1, -2, -2, -1, 1, 2};
bool st[N][N];
int main(){
int n, m, hx, hy;
cin >> n >> m >> hx >> hy;
st[hx][hy] = true;
for(int i = 0; i < 8; i ++ )
for(int j = 0; j < 8; j ++ ){
int hhx = hx + cx[i], hhy = hy + cy[i];
if(hhx >= 0 && hhx <= n && hhy >= 0 && hhy <= m)
st[hhx][hhy] = true;
}
g[0][0] = 1;
for(int i = 0; i <= n; i ++ )
for(int j = 0; j <= m; j ++ ){
if(!st[i][j]){
if(i) g[i][j] += g[i - 1][j];
if(j) g[i][j] += g[i][j - 1];
}
}
cout << g[n][m] << endl;
return 0;
}
一组测试数据:输入:8 6 0 4 输出:1617