- 博客(16)
- 收藏
- 关注
原创 小猫爬山问题(DFS)
如果我们能把所有的分配情况都列举出来,一定能找出用车最少得情况,最终求出最少需要的趟数。这时,我们需要考虑深度优先搜索算法。深度优先搜索算法,简单地说就是一种能穷举所有可能结果的算法:这个算法可以通过函数递归实现,先通过不断的迭代获得一种结果,接着回溯,再迭代得到另一种结果;不断进行上述操作,直到获得所有结果。在取得每种结果时,可以获得解决问题所需要的信息,当然,我们也可以通过一些条件判断终止某类结果的求解过程,以节省时间与空间,这被称为“剪枝”。深度优先搜索是一种图论算法,我们可以在讲授算法的书中找到..
2022-04-29 16:52:40
451
原创 并查集(合并集合)
描述:一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作; “Q a b”,询问编号为a和b的两个数是否在同一个集合中;数据范围:1≤n,m≤10^5输入:第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出:对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内
2022-04-06 23:34:10
288
原创 摆碟子问题(动态规划)
描述:假设你的餐桌上摆放了n个盘子,每个盘子有且只能放1个菜,相邻的盘子最多连续两个菜品相同。求你在桌子上能够摆放菜的方式(个数)。#include<iostream>using namespace std;int n, k, dp[2][200001], ans;int main(){ while (scanf("%d %d", &n, &k) != EOF) //分为两个种情况 dp[0][n] 1.前n个盘子的摆放总数(而且第n-1个盘子和第.
2022-04-05 23:21:59
1609
1
原创 矩阵链乘法问题(动态规划)
矩阵链乘法问题描述:输入:输入共n+1行第一行输入矩阵的总个数n[2,1000]后n行分别输入矩阵的维数[1,100]输出:最后一行输出少乘法次数输入样例 1:630 3535 1515 55 1010 2020 25输出样例 1:15125#include<iostream>#include<vector>#include<algorithm>const int Max = 1 <<
2022-04-01 10:34:00
438
原创 0/1背包问题(动态规划)
描述:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。数据范围0<N,V≤10000<vi,wi≤100输入:第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有N行,每行两个整数vi,wi,用空格隔开,分别表示第i件物品的体积和价值。输出:输出一个整数,表示最大价值。输入样例 14 51 2
2022-03-31 12:15:12
274
原创 求最大子序列和(动态规划)
最大子序列和描述:给定一个序列a[1],a[2],a[3]......a[n],你的工作是计算一个子序列的最大和。例如,给定(6,-1,5,4,-7),这个序列的最大和是6+(-1)+5+4=14。输入:输入的第一行包含一个整数T(1<=T<=20),表示测试用例的数量。然后是T行,每行以数字N(1<=N<=100000)开始,然后是N个整数(所有整数都在-1000到1000之间)。输出:对于每个测试用例,你应该输出两行。第一行是 "Case #:",#表示测
2022-03-30 23:09:25
1698
原创 最长公共子序列(动态规划)LCS
#include<iostream>#include<string>using namespace std;int n;int m;char a[1010];char b[1010];int dp[1010][1010]; //存储每个i,j对应的状态 就是教材的c[i,j];int lcs(){ for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) if (...
2022-03-28 14:36:14
742
原创 归并排序(最典型的分而治之思想)
#include<iostream>#include<cmath>#include<algorithm>using namespace std;int n;int a[100010];int temp[100010]; //临时数组 归并的时候用void merge(int low,int mid,int high)//二路归并 就是合并两个有序数组{ int k = low-1; int l = low, r = mid + 1; //l为左.
2022-03-26 16:55:04
1099
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人