04 2020 档案
摘要:问题: 给定序列X,Y,求最长公共子序列。 解析: 设dp[i][j]表示前i个x和前j个y的最长公共子序列。 dp[i][j]=max(dp[i][j],dp[i−1][j],dp[i][j−1]) 当前最长由前一个转移过来 $if(x[i]==y[j]) dp[i][
阅读全文
摘要:问题: 设n个矩阵序列,其中第i个矩阵是p[i−1]∗p[i]阶矩阵,给定矩阵链的向量P,求一种乘法次序,使得基本运算的总次数最小。 解析: 设A[i][j]为∏jk=ia[k] 设F[i][j]为A[i][j]的最少运算次数。 $F[i][j]=
阅读全文
摘要:题意: 给定 n,m,给定 m 个无序对 (a,b) 代表位置 a 上的数字和位置 b 上的数字进行比较。且这 m 个无序对无重复。 让你寻找两个序列: 第一个序列由 1∼n 组成,元素互不相同且唯一。 第二个序列,要满足和第一个序列对于 m 个比较的结果相
阅读全文
摘要:题意: 有n件商品,每天可以卖一件,每件商品的售价是p[i]元,在a的倍数天可以获得x%的利润,在b的倍数天可以获得y%的利润,利润可叠加。 如果需要获得k的利润,问最少需要卖多少天。 思路: 二分答案。对于售价高的商品分配给前mid天中利润高的时间。 代码: 1 /
阅读全文
摘要:题意: 给一个序列,问有多少个区间的异或和大于等于K。 思路: 处理出前缀异或和。 对于每个区间(l,r)的异或和为sum[l]^sum[r]。 对于每个sum[i],如果大于K,ans+1。 在字典树上查询二进制的每一位。 ①sum=1,k=1:走$next[0
阅读全文
摘要:问题: 设m元钱,n项投资,函数f[i][x]表示将x元投入第i项项目所产生的效益,i=1,2,…,n.问:如何分配这m元钱,使得投资的总效益最高? 解析: 背包问题。 设dp[i][j]表示在前i个项目投入j元所产生的最大效益。 转移方程为: $dp[i][j]
阅读全文
摘要:题意: 给出一个序列a[n]和数字x,你可以选择任意一个区间把区间中的每个数乘上x。 问区间和的最大值是多少。 思路: dp[i][0]表示第i位在更新区间的前面,dp[i][1]表示在更新区间中,dp[i][2]表示在更新区间的后面。转移为: $dp[i][0]=max(0
阅读全文
摘要:题意: 有n个员工,s元钱,现在要给每个员工发工资。每个员工的工资的范围(li,ri),求所有员工的工资中位数的最大值。 思路: 二分答案,check的时候判断工资可以大于等于mid的员工个数,用最小代价购买之后判断总价钱会不会超出范围。 代码: 1 //#include<b
阅读全文
摘要:题意: 给出一个二维坐标系,求一个最大集合,使得集合中每两个点之间的距离不为整数。 思路: 先确定集合大小,因为点不能同行或者同列,所以集合大小最大为min(n,m)+1。 然后考虑对角线就好了,因为(0,0)不能选,所以考虑从(0,min(n,m))到(min(n,m),0)的点即
阅读全文
摘要:题意: 有两种操作: ① 1 l r 表示区间(l,r)中不递减。 ② 0 l r 表示区间(l,r)中存在递减。 要求构造这个序列。 思路: 对于1,l,r中的每一个数等于前一个数,其余的数a[i]=a[i−1]−1。 对于0,l,r判断a[l]和$
阅读全文
摘要:题意: 给出一棵树,选一个节点作为根,使得所有子树的和最大,输出最大值。 思路: 换根DP。 代码: 1 //#include<bits/stdc++.h> 2 #include <set> 3 #include <map> 4 #include <stack> 5 #include <cmat
阅读全文
摘要:题意: 给一棵树,问有多少条边的长度大于K。 思路: 对于一个点x,处理出所有其他点到它的距离,n2找出经过它的所有长度加起来大于K的点对的数量。 但是找到的这些点对中存在不经过点x的点对,则减去这些点对的数量,若v是x的子节点,w是v到x的距离,则减去距离
阅读全文
摘要:题意: 给一张有向图,可以把k条边的边权变成0,求点1到n的最短路。 思路: dp+dijkstra思想。 dis[i][k]表示点1到i实行了k次把边权变为0的操作之后的最短距离。转移为: $dis[v][k]=min(dis[v][k],dis[u][
阅读全文
摘要:题意: 给定合法括号序列,可以给括号涂三种颜色:红色,蓝色,不上色。涂色需要满足以下两个要求: ①匹配括号必须一个上色一个不上色。 ②相邻括号不能上同一种颜色,但可以同时不上色。 求上色方案数。 思路: dp[i][j][k][l]表示区间(i,j)中i上颜色k,j上颜色l的
阅读全文
摘要:问题: 给出一个数组a[n],求第k小元素是什么。 解析: 分治思想,将数组五个一组划分,并计算出每组数的中位数。然后把各组中位数的中位数找出。统计数组中小于中位数的个数num,有三种情况。 ① num=k,则中位数就是要查询的数。 ② num>k,则在小于中位数的集合中
阅读全文
摘要:题意: 给定一个序列,可以把左边任意长度为i的连续序列移动到最右边(不改变连续序列的顺序)。如: 原序列为:a1,a2,a3,...,ai,ai+1,...,an−1,an 移动后的序列为:$a_{i+1},a_{i+2},...,a_{n-1},a_n,a_1,a_2
阅读全文