快速幂和线性筛法
算法分解质因数123456789101112131415161718192021222324#include<iostream>using namespace std;int main() { int T; cin >> T; while(T --) { int n; cin >> n; for(int i = 2; i <= n / i; i ++) { int s = 0; while(n % i == 0) { s ++; n /= i; } if(s) cout << i << ' ' << s << endl; } if(n > 1) c ...
树形dp和记忆化搜索
算法石子合并
f[i][j]表示的是将第i堆石子到第j堆石子合并所需的最小代价。 非入口初始化无穷大,入口考虑将i堆石子和i堆石子和合并的情况。
最后一步肯定是将 两堆石子合并,合并有很多种情况,这里枚举了位置。
1234567891011121314151617181920212223242526272829303132#include<iostream>#include<cstring>using namespace std;const int N = 310;int n;int a[N], s[N];int f[N][N];int main() { cin >> n; memset(f, 0x3f, sizeof(f)); for(int i = 1; i <= n; i ++) { cin >> a[i]; s[i] = a[i] + s[i - 1]; f[i][i] = 0; } // 因为f[1][n ...
sort()和最短编辑距离
算法力扣302周赛t3
c++自定义排序规则~
12345678910111213141516171819202122class Solution {public: vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& qs) { int n = nums.size(), m = qs.size(); vector<pair<string, int>> str(n); for(int i = 0; i < n; i ++) str[i] = {nums[i], i}; vector<int> ans; for(int i = 0; i < m; i ++) { int k = qs[i][0], trim = qs[i] ...
背包和最长上升子序列
算法分组背包
f[i][j]表示的是前i组物品,总体积不大于j的集合(所有选法)(最大值)。
①不选第i组物品;②选第i组的某个物品。
1234567891011121314151617181920212223242526272829#include<iostream>using namespace std;const int N = 110;int n, m;int v[N][N], w[N][N], s[N];int f[N][N];int main() { cin >> n >> m; for(int i = 1; i <= n; i ++) { cin >> s[i]; for(int j = 1; j <= s[i]; j ++) cin >> v[i][j] >> w[i][j]; } for(int i = 1; i <= n; i ++) for(int ...