摘要://第一次用Tarjan求强连通分量//先求强连通分量,再重新构图,找出度为0的点,并且出度为0的点只有1个//这题不能求入度,不能判断重新构图后的点的入度为n-1//因为存在单链的情况,这时,链尾的点就是答案,但是该入度为1#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N =...
阅读全文
摘要://这题做了一晚//很简单的dp水题,一开始超时,优化后又WA,结果发现是输出精度不够,至少要输出小数点后4位//先要预处理一下,不然dp过程中会出现很多重复计算//设dp[i]为完成路程a[1]+...+a[i]的最小时间,cost[i][j]为从站i换轮胎后,到站j所需的时间//dp[i] = min(dp[k]+cost[k][i]+b), 0 < k < i//dp[0] = 0;#inc...
阅读全文
摘要://这题一开始感觉是dp,状态转移方程为dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + maze[i][j]//提交上去WA//后来发现这题不能用dp,因为题目要求的是正的最小值,状态转移方程的min会取到负数,//当求出dp[n][m]为负数时,有可能存在一条和为正的路径//注意到n,m都比较小,可以直接用bfs搜索过#include <iostream>#in...
阅读全文
摘要://设dp[i][j]为选取的第i个数为j的方案数//dp[i][j] = sum(dp[i-1][k]), i-1 <= k <= j/2//ans = sum(dp[n][k])#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 15;const int M = 2005...
阅读全文
摘要://这题可以用暴力搜索//要注意减枝和各种预处理,不然各种TLE//方法是搜索s里的=s1的子串,再判断s剩下的字符是否能组成s2#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 205;char s1[N], s2[N], s[N], tmp[N];int low_tim...
阅读全文
摘要://这题有几个需要特别注意的地方//不能算对应的格子的数量/总数,只能通过计算每层的概率得到//一开始用计算总数,计得5/14和sample里的7/16对不上//这里的层数有50层, 2^50次方,用unsigned long long//在计算lcm时,要先除再乘,不然会溢出。//在计算gcd时,传入的参数a,b要满足a>b//因为这些原因各种错误RE,WA#include<iostream>u...
阅读全文
摘要://dp[i][j]表示前i个花瓶装前j束花的最大审美值//dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]+cost[j][i])#include<iostream>using namespace std;const int INF = 1000000000;const int N = 105;int dp[N][N];int cost[N][N];int f, n...
阅读全文
摘要://dp[i][k]表示前i个店添加k个供应点所达到的最小值//状态转移方程为:dp[i][k] = min(dp[j][k-1], dis[j+1][i]),//其中k-1 <= j <= i-1, dis[i][j]表示从第i个饭店到第j个饭店添加一个供应点所达到的最小值,取i,j中间值即可//初始化:dp[0][0] = 0;#include <iostream>#include <cstr...
阅读全文
摘要://这题之前一直卡着没过,今晚蛋疼了一晚才过//这题是拓扑排序,有几个易错点//拓扑排序的时候,m每次要保证入度为0的点只有1个,因为题目要求的是完全排序//当满足条件(确定排序或检测到矛盾)后,后面的输入就可以不管了#include <iostream>#include <queue>#include <string>#include <cstring>using namespace std;c...
阅读全文
摘要://这题开始方法想错了,调了半天,才发现动规方程列不正确//这题可以看做一维数组的连续子串最大和的扩展//方法是把二维转换成一维,再用一维的动规方程求//把多行合并成一行求#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 105;const int INF = 100000...
阅读全文
摘要://利用stack计算表达式//类似计算中序表达式那样,用两个栈,一个存字母,一个存符号//这题要自己存入*号,要用一个变量储存之前输入的符号,判断是否要把*入栈//如果前一个符号是(,则不需要。#include <iostream>#include <stack>#include <cstdio>using namespace std; struct info{ int row, col; in...
阅读全文
摘要:部分背包问题,贪心 先按J[i] / F[i] 升序排序,每次选取J[i] / F[i]的最大值,如果不能取满J[i],则取把背包填满的容量即可。原因很简单,每次取J[i] / F[i]的最大值就使得背包单位体积价值最多。从大到小选择,自然会得到最优解。 #include <iostream>#include <algorithm>#include <cstdio>using namespace...
阅读全文
摘要:这题就是任务调度,给定任务的起始和结束时间,求能完成任务的最大数目。 贪心,先按任务的结束时间递减排序,再逐个选择。选择活动的起始时间大于已选择活动的结束时间 #include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;const int N = 50005;struct...
阅读全文
摘要:题目给出蛇形矩阵,要求计算给定的值在蛇形矩阵的位置。 注意到,矩阵的右上角的值是某个奇数的平方,从内到外依次是1,3,5…的平方。先求出要求的数对应的右上角的数的坐标,再根据与距离来计算指定数的坐标 #include <iostream>#include <cstdio>using namespace std;int n, m;void find(){ int place_zero = n/2+...
阅读全文
摘要:这题有些像求连续子序列和的最大值 设dp[i][j]表示i个火车头拉动j个火车舱的人数和的最大值,状态方程如下:dp[i][j] = max(dp[i-1][j-times]+num[j]+..+num[j-times+1], dp[i][k]) #include <iostream>#include <cstdio>#include <cstring>using namespace std;c...
阅读全文
摘要:这题想了很久,虽然知道是01背包,但加了两个约束条件后,就不知道如何做了。 直到看到解题报告才懂这题思路。先定死一个变量,求另外一个变量,得到各个结果再找出最优解。 设dp[i][v]为前i头牛给定smart为v时的最大fun值之和。就可以转化为01背包。 dp[i][v] = max(dp[i-1][v-s[i]] + f[i], dp[i-1][v])。注意由于smart可以是负的,要把sm...
阅读全文
摘要:这题做得相当顺利,1A 题意是求夫妇两人洗完衣服用的最小时间。先按衣颜色分类,对于每种颜色的衣服,最优解是都平分即V/2,背包容量为洗衣服的花费,用01背包来标记是否可以通过组合组成某个容量。若不能平均分,就从V/2开始搜索,最接近V/2的较大值就为两人洗完每种颜色衣服的最短时间,把各种颜色衣服的解加起来即为答案 #include <iostream>#include <map>#include...
阅读全文
摘要:这题以前是母函数做的,今天看了DD的背包九讲,该用背包模型做。 这题是完全背包。设dp[i][v] 为用前i个数组成v的方案数,状态方程如下:dp[i][v] = sum(dp[i-1][v-k*i]) #include <iostream>using namespace std;const int N = 122;//dp[i][v] 为用前i个数组成v的方案数//dp[i][v] = sum...
阅读全文
摘要:根据性别分为两个集合,然后求最大独立集。由于题目没有给出性别,可以不划分集合,每个集合都为n个,求最大匹配数,最后除2即可。
阅读全文
摘要:开始误解了题目意思,认为观众留下是要同时满足两个条件。后来看了解题报告才明白过来。当观众想要留下来的宠物出局时,这个观众才认为会离开 。 以cat_lover和dog_lover把观众分为两个集合。只要两个集合内的人的选择有冲突,这两个顶点连接,边代表矛盾,然后求最大独立集。 最大独立集 = 顶点数 - 最小顶点覆盖数(最大匹配数)
阅读全文