RT
题目描述
农场主FJ的家人在挤奶的时候,会尽尽可能地做些家务。在FJ家里,有些家务活要等其他家务活完成后才能开始,例如,只有奶牛在进入牛栏之后、才能给奶牛洗澡。
FJ有一份必须完成的N(3<=N<=10000)家务活清单,每个家务需要一个整数时间(1<=时间长度<=100)才能完成,并且可能有其他家务活必须在该家务开始之前完成,我们将这些称为先决家务。
至少有一件家务活没有先决条件:第一件、数字1。FJ的家务活列表排列很有条理,家务K(K>1)只能有家务1~K-1作为先决家务。
编写一个程序,读取从1到N的家务列表以及相关时间和所有先决家务。现在计算完成所有N项家务所需的最短时间,当然不相互依赖的家务活可以同时进行。
输入格式
第1行:一个整数,N
第2..N+1行: 每行有几个空格分隔的整数。第2行包含家务1的信息,第3行包含家务2的信息,依此类推。每行包含完成家务的时间长度、先决家务数目Pi(0<=Pi<=100)和Pi个先决条件。
输出格式
完成所有家务所需的最短时间
输入样例
7
5 0
1 1 1
3 1 2
6 1 1
1 2 2 4
8 2 2 4
4 3 3 5 6
输出样例
23
不要跟我说什么 P1113,那题我的代码改完输入过了,但是仍然站外爆零 /kk
Code:
#include<cstdio>
#include<vector>
#define max(x,y) (x<y?y:x)
int n,l,ans,tmp,t[10005],d[10005];
std::vector<int>G[10005];
int dp(int x){
if(d[x]) return d[x];
d[x]=t[x];
for(int i=0;i<G[x].size();i++)
d[x]=max(d[x],dp(G[x][i])+t[x]);
return d[x];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&t[i],&l);
while(l--)
scanf("%d",&tmp),G[tmp].push_back(i);
}
for(int i=1;i<=n;i++)
ans=max(ans,dp(i));
printf("%d",ans);
return 0;
}