第一题:
题目大意:
给出N个数的m对关系(a,b)表示a大于b。 每个数至少为100,求这些书最小可能的和.
解题过程:
1.看到这题就想到之前USACO的一道题,那题是N头牛排序,然后给出m对关系(a,b)表示a排在b前面,然后问哪些牛的位置可以确定。只要对每个点2次dfs求出对于每头牛,有多少个比它大的,多少个比它小的,如果加起来是N-1,那么这头牛的位置就可以确定了. 这题也差不多,对于每个点,处理出比它小的那些点中最大可能是多少就可以.
2.具体做法是先做一次拓扑排序判断是否有环,排除无解的情况.然后根据拓扑序来dp。 d[i]=max{d[i.child]+1}。最后累加即可。
第二题:
题目大意:
N*M的网格图,给它铺管道(就是手机上接水管的游戏)。有些格子已经铺好了,有些是不能铺的,求把(1,1)和(N,M)连起来的方案数。水管只有4种:
解题过程:
1.很裸的dp额。可以发现水管不管怎么连,都是只能往下走或者往右走的,所以就变成了过河卒。。直接F[i][j][k]表示走到(i,j)且该格子放的是k号水管的方案数,然后递推就可以了。
2.状态貌似也可以压成2维,问题可以转化为从(1,1)走到(n,m)的方案数,有些格子已经规定了方向,有些格子不能走。然后只能往右或者往下走。
第三题:
题目大意:
有N个任务,每个任务有一个到达时间Ai,最迟完成时间Bi,完成需要的时间Ti. 从时刻0开始,如果有工作已经到达并且可以按时完成,那么必须要选一个工作来做。求最少的工作时间。
Ti>=1,0<=Ai,Bi<=1200, n<=1000, Bi-Ai 要大于等于 Ti,且小于 2Ti。
解题过程:
1.直接想到按时间来dp,F[i]表示假设时刻i才上班,那么最少工作时间是多少.方程转移也很简单:
如果时刻i没有任务要做,那么显然F[i]=F[i+1];
如果有任务要做,那么F[i]=min(F[i+Tj]+Tj).
2.写完之后自己设计数据测试的时候,5个工作的Ti全部设成1,结果发现答案是7,才发现题目中“Bi-Ai 要大于等于 Ti,且小于 2Ti”不是废话。。。如果没有这句话,上面的方程就不对了,因为有可能同一个任务做了好几次。
今天的题略水,一个小时就全打完了。。。编译器的字体不知道选哪个好,被字体恶心到了,打个for语句就占了屏幕的一半宽。。