05 2021 档案
摘要:思路 状态表示: f[i][j]表示前i个物品在容量为j的背包下的最大价值 v[i]表示第i个物品的价值,w[i]表示第i个物品的重量 状态转换: 对于第i个物品 如果当前背包不可以装下这个物品,那么当前的f[i][j] = f[i - 1][j],也就是上一个状态的最大价值 如果当前背包可以装下这
阅读全文
摘要:题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 共t行,每行一个整数,表示对应有多少种不同的方法。 样例 1 7 3 输出 8 递归方法思路 把n个苹果分到m个盘子,也就是求f(n, m),有两种情况
阅读全文
摘要://第一个,区间被划分成[1, mid], [mid + 1, r] int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; //判断mid是否满足性质 else l =
阅读全文
摘要:如何求解最长公共子序列 状态方程:f[i][j] = if(s1[i] == s2[j])f[i - 1][j - 1] + 1; else max(f[i - 1][j], f[i][j - 1]); 建立一个二维数组,二维数组的横坐标就是第一个子串的每一个字母,二维数组的纵坐标就是第二个字串的每
阅读全文
摘要:思路 输入a[i] f[i]表示以a[i]结尾的最长递增子序列 遍历a[i]数组,对于每一次访问,找到他之前的(1-(i-1))最大的递增子序列f[j] 如果当前的a[i]大于a[j],也就是说a[i]拼接到a[j]后面可以继续递增,那么f[i]就是f[j] + 1; 如果当前的a[i]不大于a[j
阅读全文
摘要:#include <iostream> using namespace std; const int N = 1010, M = 310; long long f[M][M]; int v1[N], v2[N], w[N],v3[N];//怪物的生命值,蓝量,价值 int main() { int
阅读全文
摘要:思路: 当时没打表,导致没又看到这个性质,当n大于90时,结果几乎一样,所以只要预处理前90位,然后后90位输出第90位的结果就行 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using n
阅读全文
摘要:原题链接 题目描述 给定两个字符串s1,s2,求把s1变成s2的最小步数, s2可以任意改变顺序 比如ELLY要变成KRIS,可以把KRIS变成IRSK,那么就是把E变成K(只能向后变,比如要把B,变成A就需要25个步数),L变成R...最后的最小步数是29步 因为题目数据范围只有50可以使用一个一
阅读全文
摘要:空间 #include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { cout << 256 * 1024 * 1024 / 4 << endl; return 0; } 答案
阅读全文
摘要:思路 采用暴力搜索,然后进行剪枝 每一次递归先判断是否考虑完所有物品 分两种情况递归 1.考虑把当前物品装入背包 1.当前背包可以装的下这个物品 背包容量减去这个物品的重量 总价值加上这个比尔堡的重量 数组标记征额背包已经访问过 搜索下一个背包情况 还原标记情况 2.当前背包不可装下这个物品 考虑下
阅读全文

浙公网安备 33010602011771号