[FROM WOJ]#1026 杂务CHORE

#1026 杂务CHORE

洛谷评级 普及/提高- 的题……(震惊!!!)

题面
农夫john的农场在给奶牛挤奶前有很多杂务要完成。他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及做一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。
当然,有些杂务必须在另一些杂务完成的情况下才能开始完成。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能将它放到挤奶的机器上去挤奶。
John有需要完成的n个杂务的清单,每一个杂务需要一定的时间来完成它,有些杂务有一些准备工作,也就是说在开始完成它们的时候,这些准备工作必须已被完成。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务1。John的清单是有一定顺序的,杂务k(k>1)的准备工作只可能在杂务1…k-1中。
写一个程序从1到n读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,你可以假定john的农场有足够多的工人来同时完成任意多项任务。

输入
第一行:一个整数n,必须完成的杂务的数目(3 <= N <= 10,000) 第2-n+1行: 共有n行,每行有一些整数 工作序号(1…n,在输入文件中是有序的) 完成工作的时间len(1<=len<=100) *一些必须完成的准备工作,总数不超过100个,由一个数字0结束。有些杂务没有需要准备的工作只描述一个单独的0

输出
一个整数表示完成所有杂务所需的最短时间

样例输入
7
1 5 0
2 2 1 0
3 3 2 0
4 6 1 0
5 1 2 4 0
6 8 2 4 0
7 4 3 5 6 0

样例输出
23

SOL
第一眼看到这道题,本蒟蒻马上开始xiang树形DP(逃)……几秒钟后发现这道题是普及/提高-,马上开始更换思路。
虽然从评级上想不通,但我还是考虑用topsort,但是2019寒假题单上分明地写着“动态规划”,于是开始想DP方程,然后觉得好像可以做……
因为信息是按照奶牛的编号给出的,所以可以边做边DP,DP方程的意义,具体看代码吧。

代码:

#include<bits/stdc++.h>
using namespace std;//震惊——没用读优!!! (感人至深)
int n,cost,t,f[10005],ans;
int main(){
    scanf("%d",&n);
    for(int register i=1;i<=n;++i){
        scanf("%d%d",&i,&cost);
        int prev=0;
        while(scanf("%d",&t)&&t)prev=max(f[t],prev);
        f[i]=prev+cost;ans=max(f[i],ans);
    } 
    printf("%d",ans);return 0;
 } 

猜你喜欢

转载自blog.csdn.net/hzq_oi/article/details/87212749