今天这道题,可用拓扑排序思想解,也可以用dp,dp相对而言代码更加简洁,加上我还没掌握好拓扑,看来还是得加吧劲学习了
题目
1.题目描述
John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工作。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务11。John有需要完成的nn个杂务的清单,并且这份清单是有一定顺序的,杂务k(k>1)k(k>1)的准备工作只可能在杂务11至k-1k−1中。
2.解题思路
因为有些杂务是需要在前驱杂物完成后才开始做,且杂物是有顺序的,即要是得完成所有杂物所需要时间最短,就是该杂物的最早完成时间就是本身时间加上其前驱中所需要耗费的的最大时间,并在所有杂物最早完成时间取最大一个就是答案啦,符合dp思想
3.AC代码
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int n;
static int[] w;//第id个任务完成的时间
static int res;//所有杂物做完最早完成的时间
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
w=new int[n+1];
for(int i=0;i<n;i++) {
int id=sc.nextInt();
int len=sc.nextInt();
w[id]=len;
int a=sc.nextInt();
while(a!=0) {
w[id]=Math.max(w[id], len+w[a]);
a=sc.nextInt();
}
res=Math.max(res, w[id]);
}
System.out.println(res);
}
}