[Poj #1949] Chores

1949号题,果然非常良心。
数据已经拓扑排序好了,那我们直接做。
dp[i]表示完成任务i所需的最小时间,易dp[i]=max{dp[pre[i][j]]}+a[i],其中pre[i][j]表示i的第j个前需家务。
然后把所有dp值取最大,就是答案了。

#include<cstdio>
using namespace std;
int maxf(int x,int y){return x>y?x:y;}
int minf(int x,int y){return x<y?x:y;}
int dp[100010];
int pre[100010][110];
int a[100010];
int main()
{
	int n,m,i,j,k,x,y,z,ans;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		scanf("%d",&pre[i][0]);
		for(j=1;j<=pre[i][0];j++)
		scanf("%d",&pre[i][j]);
	}
	for(i=1;i<=n;i++)
	{
		dp[i]=0;
		for(j=1;j<=pre[i][0];j++)
		{
			dp[i]=maxf(dp[i],dp[pre[i][j]]);
		}
		dp[i]+=a[i];
	}
	ans=0;
	for(i=1;i<=n;i++)
	ans=maxf(ans,dp[i]);
	printf("%d
",ans);
	return 0;
}
/*
//sample
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
ans:23
*/
原文地址:https://www.cnblogs.com/Rain142857/p/11731328.html