动态规划-poj1949
题目链接:http://poj.org/problem?id=1949
题目描述:
思路:用一个数组dp来存完成第i个任务时所需的最短的时间,dp[i] = max(dp[j]) +time, j是需要在它前面完成的任务的序号,time是完成当前任务所需时间。
对于任务5来说,
代码实现:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int dp[100001]; 6 int main() 7 { 8 int ans=0; 9 int i,s,cost,pre,t,p,n; 10 scanf("%d",&n); 11 for(i=1;i<=n;i++){ 12 scanf("%d%d",&cost,&pre); 13 p=0;//p每次都要清零 14 for(s=1;s<=pre;s++){ 15 scanf("%d",&t); 16 p=max(p,dp[t]);//p记录的前驱任务完成所需的最长时间,如果有多个前驱,就是去找出最长的前驱任务完成时间
17 } 18 dp[i]=p+cost;//当前任务完成所需最短时间等于前驱任务完成的时间+自身完成时间cost 19 ans=max(dp[i],ans);//ans所取值是所有dp[i]中的最大值,也就是所有任务完成的最少时间。 20 } 21 printf("%d\n",ans); 22 return 0; 23 }