6:lis
给定正整数序列x1 ,…… , xn。
(1)计算其最长递增子序列的长度s。
(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列。
(3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长
度为s的递增子序列。
看到题目就666了,前两问不是经典dp?因为序列是上升的,所以如果在x1前面加一个x1,个数显然多了f[x2][xn][s-1],或者xn后面加一个xn, 一样的……然后发现题意理解错T_T
“多次使用x1和xn”到底是什么意思……
然后这个东西居然可以用网络流做蛤蛤蛤
首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K。
1、把序列每位i拆成两个点<i.a>和<i.b>,从<i.a>到<i.b>连接一条容量为1的有向边。(拆点,表示每个数只能用一次)
2、建立附加源S和汇T,如果序列第i位有F[i]=K,从S到<i.a>连接一条容量为1的有向边。
3、如果F[i]=1,从<i.b>到T连接一条容量为1的有向边。
4、如果j>i且A[i] < A[j]且F[j]+1=F[i],从<i.b>到<j.a>连接一条容量为1的有向边。
所以,这道题可以改成一道不能用dp做的题
给定一个序列,第i个数为ai,可以用bi次,求最长上升子序列个数
建模方法一样……
上述建模方法是应用了一种分层图的思想,把图每个顶点i按照F[i]的不同分为了若干层,这样图中从S出发到T的任何一条路径都是一个满足条件的最长上升子序列。由于序列中每个点要不可重复地取出,需要把每个点拆分成两个点。单位网络的最大流就是增广路的条数,所以最大流量就是第二问结果。第三问特殊地要求x1和xn可以重复使用,只需取消这两个点相关边的流量限制,求网络最大流即可。
正如某神犇blog上面说的:做完一道题,要看看为什么自己想不出来,别人想得出来,这方面能力我还是欠缺的
7:试题库问题
“假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别
属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个
满足要求的组卷算法。”
看了前面几题,对网络流建模有了一点认识
每个题目只能用一次,把他们向汇点连边流量为1
类别i的题目要有ai道题,可以源点向他们连边流量为ai
题目j可以是类别i,把类别i向题目j连边流量为1
看了题解是对的
8:机器人路径规划问题
“机器人Rob可在一个树状路径上自由移动。给定树状路径T上的起点s 和终点t,机器
人Rob要从s运动到t。树状路径T上有若干可移动的障碍物。由于路径狭窄,任何时刻在
路径的任何位置不能同时容纳2 个物体。每一步可以将障碍物或机器人移到相邻的空顶点
上。设计一个有效算法用最少移动次数使机器人从s运动到t。”
对于给定的树T,以及障碍物在树T中的分布情况。计算机器人从起点s 到终点t的最
少移动次数。
我想,既然是在树上,不妨把路径找出来,对路径上的每一个点跑一遍bfs,然后建立边i,j,费用为i,j距离,流量为1,,然后对于每一个有障碍物的在路径上的点,从源点到它连边流量为1费用0,对于没有障碍物的不在路径上的点,它到汇点连边流量为1费用0,然后跑费用流,最小费用+树上两点路径长就是答案辣
结果看见了出题人的友情提示链接:“注意此题的坑人描述,数据给出后几组大数据的不是一棵树,是一张图。。。⊙﹏⊙b汗”
然后就不会辣蛤蛤蛤
然后还是没有题解的-.-
无奈只能上网翻题解 结果发现网上都没有TAT
唉,当成树来做吧
9:方格取数问题
“在一个有m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。”
黑白染色后就变成了取黑不能取的一定是白的,取白不能取的一定是黑的
二分图?
假设全部都取,一定不成立,那么我们需要去掉某些点
最小割?
由源连到所有黑点,所有白点连到汇,流量为点权
然后黑点连到他们相邻的白点,流量无限大
搞完啦
10:餐巾计划问题
“一个餐厅在相继的N
天里,每天需用的餐巾数不尽相同。假设第i天需要ri块餐巾(i=1,2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,洗一块需m天,其费用为f
分;或者送到慢洗部,洗一块需n 天(n>m),其费用为s<f 分。”
把题目改成洗碗的部门有多个,要洗ti天,要si块钱
第i天需要ri块餐巾?拆点?
每块餐巾有费用?费用流?
当我打了bc之后,一切都明朗了
提供一个双倍经验,hdu King‘s Pliot
卧槽比赛的时候我还没看这题,艹
将每一天拆点,xi表示这天的碗是干净的,yi表示是脏的
源点连边到所有的xi,流量无限大,费用p(买新碗
xi连边到yi,流量ri,费用0(用碗
xi连边到xi+1,yi连边到yi+1,流量无限大,费用0(保持碗的状态不变
yi连边到xi+ti,费用为si(使用第i种洗碗部门
11:航空路线问题
“给定一张航空图,图中顶点代表城市,边代表2城市间的直通航线。现要求找出一条满
足下述限制条件的且途经城市最多的旅行路线。
(1)从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向从东
向西飞回起点(可途经若干城市)。
(2)除起点城市外,任何城市只能访问1次。”
每个城市只能经过一次,除了起点和终点,只能走两条路线,等价于起点和终点可以经过两次,拆点
如果对题意稍改一下,改成每个点有价值(费用)也一样
拆点之后,图中原来的边费用为0,每个点入点到出点费用为点权
跑费用流
12:软件补丁问题
“T 公司发现其研制的一个软件中有n 个错误,随即为该软件发放了一批共m 个补丁程
序。每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又
不包含另一些错误时才可以使用。一个补丁在排除某些错误的同时,往往会加入另一些错误。
换句话说,对于每一个补丁i,都有2 个与之相应的错误集合B1[i]和B2[i],使得仅当软件
包含B1[i]中的所有错误,而不包含B2[i]中的任何错误时,才可以使用补丁i。补丁i 将修复
软件中的某些错误F1[i],而同时加入另一些错误F2[i]。另外,每个补丁都耗费一定的时间。
试设计一个算法,利用T 公司提供的m个补丁程序将原软件修复成一个没有错误的软
件,并使修复后的软件耗时最少。”
这!题!不!是!网!络!流!……
最短路……二进制压位之后根据补丁连边,具体来说就是如果一个状态能够通过一个补丁转移到另一个状态就连边,边权为补丁费用,然后跑最短路
13:星际转移问题
“由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了。
于是在月球上建立了新的绿地,以便在需要时移民。令人意想不到的是,2177 年冬由于未
知的原因,地球环境发生了连锁崩溃,人类必须在最短的时间内迁往月球。现有n个太空站
位于地球与月球之间,且有m 艘公共交通太空船在其间来回穿梭。每个太空站可容纳无限
多的人,而每艘太空船i 只可容纳H[i]个人。每艘太空船将周期性地停靠一系列的太空站,
例如:(1,3,4)表示该太空船将周期性地停靠太空站134134134…。每一艘太空船从一个太
空站驶往任一太空站耗时均为1。人们只能在太空船停靠太空站(或月球、地球)时上、下船。
初始时所有人全在地球上,太空船全在初始站。试设计一个算法,找出让所有人尽快地全部
转移到月球上的运输方案。”
大原题……黑书上的题……
拆点,把每个点拆成t个点,表示这个点在时间t的状态
从小到大枚举t之后问题变成判断k个人在时间t能否全部到达终点
对于每个运输船i->j,连边(i,t)->(j,t+1)流量为运输船容量表示这个运输船要花1单位时间carry H[i]个人,对于每个点停留人数无限制所以连边(i,t)->(i,t+1)流量无限大
每次跑网络流的时候,可以根据上一次的结果来跑,具体地来说就是保留原边流量,连边(u,0)->(v,t-1),流量为上一次结果
14:孤岛营救问题
“1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被
敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的
地形图。迷宫的外形是一个长方形,其南北方向被划分为N 行,东西方向被划分为M列,
于是整个迷宫被划分为N×M 个单元。每一个单元的位置可用一个有序数对(单元的行号,
单元的列号)来表示。南北或东西方向相邻的2 个单元之间可能互通,也可能有一扇锁着的
门,或者是一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所有的门被分成P类,
打开同一类的门的钥匙相同,不同类门的钥匙不同。
大兵瑞恩被关押在迷宫的东南角,即(N,M)单元里,并已经昏迷。迷宫只有一个入口,
在西北角。也就是说,麦克可以直接进入(1,1)单元。另外,麦克从一个单元移动到另一个
相邻单元的时间为1,拿取所在单元的钥匙的时间以及用钥匙开门的时间可忽略不计。”
又是最短路……二进制压位表示每格状态……然后直接bfs……
15:汽车加油行驶问题
“给定一个N*N 的方形网格,一辆汽车从起点出发驶向右下角终点。在若干个网格交叉
点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:
(1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在起
点与终点处不设油库。
(2)汽车经过一条网格边时,若其X 坐标或Y 坐标减小,则应付费用B,否则免付费用。
(3)汽车在行驶过程中遇油库则应加满油并付加油费用A。
(4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费用A)。
(5)(1)~(4)中的各数N、K、A、B、C均为正整数,设计一个算法,求出汽车从起点出
发到达终点的一条所付费用最少的行驶路线。”
分层图最短路……把每个点拆成k个点表示行驶到这个点还有的油量
行驶网格边=从这一格连向下一格油量-1的点费用0(如果当地是加油站则必须加油,这时只从这一格满油连向下一格油量-1的点费用0)
回头=从这一格连向下一格油量-1的点费用b(如果当地是加油站则必须加油,这时只从这一格满油连向下一格油量-1的点费用b)
加油=这一格油量为任何数的连向油量满的费用a(有时候当地不是加油站,这时费用为a+c)
然后跑最短路……
16:数字梯形问题
“给定一个由n 行数字组成的数字梯形如下图所示。梯形的第一行有m 个数字。从梯形
的顶部的m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶
至底的路径。
规则1:从梯形的顶至底的m条路径互不相交。
规则2:从梯形的顶至底的m条路径仅在数字结点处相交。
规则3:从梯形的顶至底的m条路径允许在数字结点相交或边相交。”
互不相交=每个点只能用一次,拆点费用流
仅在数字节点处相交=边只能用一次,点可以用无限次,一样的拆点费用流
允许在数字结点相交或边相交=朴素的数字三角形,dp
17:运输问题
“W 公司有m个仓库和n 个零售商店。第i 个仓库有ai个单位的货物;第j 个零售商店
需要bj个单位的货物。货物供需平衡,即ai的和=bj的和。从第i 个仓库运送每单位货物到
第j个零售商店的费用为cij。试设计一个将仓库中所有货物运送到零售商店的运输方案,
使总运输费用最少。”
源连仓库流量ai费用0,商店连汇流量bj费用0,每个仓库连每个商店流量无限大费用cij,跑网络流
18:分配问题
“有n件工作要分配给n个人做。第i 个人做第j 件工作产生的效益为cij 。试设计一个将
n件工作分配给n个人做的分配方案,使产生的总效益最大。”
网络流,每个人只能用一次,每件工作也是只能用一次
源连人,工作连汇,流量1费用0
人连工作流量1费用cij
直接做
19:负载平衡问题
“G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等。如何用最
少搬运量可以使n 个仓库的库存数量相同。搬运货物时,只能在相邻的仓库之间搬运。”
糖!果!传!递!
这题居然可以用网络流做……
网络流的一个重要条件是入流=出流
也就是说,类似入度出度关系(黑书 混合图的欧拉回路 回路的入度=出度)还有类似这题的供求平衡问题,可以考虑网络流
供求问题具体来说是这样的
供应和需求的总量相等(总入度=总出度等),可以通过一些方式改变点的状态(供应量,需求量)
20:深海机器人问题
“每条预定路径上的生物标本的价值是已知的,而且生物标本只能被采集一次。本题限定深海机器人只
能从其出发位置沿着向北或向东的方向移动,而且多个深海机器人可以在同一时间占据同一
位置。
给定每个深海机器人的出发位置和目标位置,以及每条网格边上生物标本的价值。计算
深海机器人的最优移动方案,使深海机器人到达目的地后,采集到的生物标本的总价值最高。”
做了前面的题之后这题就是一眼
每个地方的生物标本只能采集一次,拆边,每条边拆成两条边
一条是第一次走过,有价值,也就是费用
一条是没有费用的
多源汇就建超级源超级汇
然后跑最大费用最大流
21:最长k可重区间集问题/22:最长k可重线段集问题
“对于给定的开区间集合I和正整数k,计算开区间集合I的最长k可重区间集的长度。”
“对于给定的开线段集合I和正整数k,计算开线段集合I的最长k可重线段集的长度。”
k可重线段集其实就是k可重区间集,只是每个区间有了权值,k可重区间集区间权值为区间长度。
所以两题都可以用21题的方法做
最大权不相交路径问题,可以用最大费用最大流解决。
先离散化
s连1流量k,2n连t流量k,i连i+1流量无穷大
对于每个区间(a,b),从a对应的顶点i到b对应的顶点j连接一条容量为1,费用为权值的有向边。
然后跑最大费用最大流
23:火星探险问题
“用一个P*Q 网格表示登陆舱与传送器之间的位置。登陆舱的位置在(X1,Y1)处,传送器
的位置在(XP ,YQ)处。”
“登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动。探测车在移动中还必须采集岩石标本。
每一块岩石标本由最先遇到它的探测车完成采集。每块岩石标本只能被采集一次。岩石标本
被采集后,其他探测车可以从原来岩石标本所在处通过。探测车不能通过有障碍的地面。本
题限定探测车只能从登陆处沿着向南或向东的方向朝传送器移动,而且多个探测车可以在同
一时间占据同一位置。如果某个探测车在到达传送器以前不能继续前进,则该车所采集的岩
石标本将全部损失。”
“给定每个位置的状态,计算探测车的最优移动方案,使到达传送器的探测车的数量最多,
而且探测车采集到的岩石标本的数量最多。”
先拆点,把一个非障碍点拆成两条边,一条有费用流量1,一条没费用流量无穷大
每个点连向隔壁费用0流量无穷大
然后最大费用最大流
至于记录路径的话,显然这个图可以按照到起点的距离分层,对于每一层的点只会连向下一层的点
然后我们对于每一层的点看看这个点流给后面的点多少流量
就可以记录路径了
或者直接dfs也可以记录路径
反正记录路径这种事随便做
24:骑士共存问题
玛雅终于到最后一题了
“对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑
士,使得它们彼此互不攻击。”
在一个点放骑士=不能在另一个点放骑士
选A不能选B,选B不能选A,那么我们在AB之间连一条边
而且我们都知道,一个“马”跳三步显然没有办法跳回原位
也就是说不存在“三角形”
也就是说,二分图!
二分图最大独立集!
看了题解还是太naive
不需要说明“一个“马”跳三步显然没有办法跳回原位”
只要把棋盘黑白染色,显然“马”跳一步一定是跳到和自己不同颜色的格子
所以这肯定是个二分图
用网络流的方法解决棋盘上的问题,一般都要对棋盘黑白染色,使之成为一个二分图。
嗯这个坑填完了