T1:设f[i][j]表示表示前i排座位分了j段的最小登机难度。则我们枚举r表示r~i分一段,转移为f[i][j]=min(f[r-1][j-1]+r~i的难度),ans=f[n][k]。注意优化。
T2:显然每两行相隔w-1,每两列相隔h-1是最优的。那么答案就是W/(2w)*H/(2h)。最后要特判一下W%(2w)和H%(2h)是否大于等于w或h,若大于等于则要加上最后的矩阵。
T3:网络流。
求出所有前缀种类和后缀种类,然后以前缀种类为左边的点,后缀种类为右边的点,以字符串为边构造出一个二分图(中间连边要赋为无穷大)。然后用网络流做一遍二分图匹配,匹配出来的最大流量就是组数。因为每一个字符串的前缀和后缀必须被选一个,而求了最大流之后每一条中间连边连着的两点与源点于汇点的连边必有一条被割掉(中间的不可能被割)。
怎样求方案呢?我们构建出最后的残量网络,然后从源点开始做一遍bfs,看看那些点到源点或汇点的边被割了(若左边的点不能能到达或右边的点能到达就说明这个点被割边了)。而如果一个点被割边了,那么就说明这个点所对应的字符串被分到了一个组。注意要打标记判断每个字符串之前有没有被分过组。
总结:通过这一题学了一些有关网络流的东西:
1、割:一个边集,删掉这些边之后使得源点不能到汇点。
2、最大流等于最小割。
3、若遇到这类两点只能切必须选其中之一,网络流做二分图匹配是套路。
4、顺便复习了一下增广路算法:每一次找一条源点到汇点的合法路径,然后答案加上这条路径上的最小值,并且把路径的残量网络上的路径减去最小值。注意设反向弧。
T4:这一题我们可以拆位处理。每一位只有选了奇个1才有贡献。那么我们可以算出每一个位有多少个数这一位为0或1,然后枚举1的个数,最后用组合数算就行了。