E. Cats and Fish
题意:有m条鱼和n只猫,每只猫需要一定的时间吃掉一条鱼。两只猫同时要吃鱼的时候优先让速度快的吃。问第x分钟结束的时候还剩下多少条完整的鱼和不完整的鱼。
题解;把猫吃鱼的时间排个序然后按照题意模拟即可。
#include
#include
#include
#include
#include
#include
#include
F. Secret Poems
题意:把一个字符矩阵从一种变换变成另一种变换
题解:先把原来的串还原出来,再按照规则模拟变换一下。
#include
#include
#include
#include
#include
#include
#include
G. Liaoning Ship’s Voyage
题意:要从地图的(0,0)移动到(n-1,n-1),且给定了一个三角形区域不能经过,求最小的步数。
题解:关键就是在走每一步的时候判断路径有没有和给定的三角形相交。判断比较麻烦,路径在三角形的边上或者只经过某一个顶点的情况是可以通行的,只要不经过三角形的内部即可。考虑到状态规模不大且单条路径不长,可以在路径上等分100个点,只要这些点都不在三角形的内部即可认为路径不经过三角形的内部。
#include
#include
#include
#include
#include
#include
H. Puzzle Game
题意:给定一个矩阵,现可以将矩阵中的一个元素变为p,求变换之后的最大子矩阵的值。
题解:用dp求最大子矩阵的时间复杂度是O(n^3),如果枚举变换的位置,时间复杂度就会达到O(n^5)。
如果要修改的话肯定是对最大子矩阵内的某个元素进行修改,否则最大子矩阵之和不会变化。因此我们需要预处理出最大子矩阵的位置。遍历最大子矩阵中的点,修改一个点之后新矩阵的最大子矩阵是:
Max(上方、下方、左方、右方最大子矩阵,包含此点的新最大子矩阵)。
因此还需要预处理出每行上方、下方的最大子矩阵和每列左方、右方的最大子矩阵。
如果存在多个最大子矩阵,维护任意一个即可。因为如果点被多个最大子矩阵所包含,那么修改这个点对这些最大子矩阵的效果是相同的。如果有不包含这个点的最大子矩阵,我们在预处理的时候会计算出来。
预处理的时间复杂度为O(n^3),维护最大子矩阵的时间复杂度为O(n^2),总的时间复杂度为O(n^3)。
#include
#include
#include
#include
#include
#include
#include
J. Pangu and Stones
题意:合并石子,但每次只能合并连续的石子堆且堆数必须在给定的区间之内。求合并的最小花费。
题解:区间dp,用dp[i][j][k]表示将从第i堆到第j堆石子合并成k堆的最小花费。则状态转移方程为:
K=1:dp[i][j][1]=min(dp[i][p][x-1]+dp[p+1][j][1]+sum(i,j)),i<=p
K>1:dp[i][j][k]=min(dp[i][p][k-1]+dp[p+1][j][1]),i<=p
#include
#include
#include
#include
#include
#include
#include