Giroro制造武器

Giroro制造武器

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 12   Accepted Submission(s) : 4

Font: Times New Roman | Verdana | Georgia

Font Size:

Problem Description

自从keroro变成猩猩之后,giroro觉得这简直就是个耻辱。于是他决定自己制造武器去秒了毒蛇的基地!
制造一件武器是一件非常麻烦的 事情,例如制造一把刀:首先需要做好刀柄和刀刃,然后才能把刀基本做出来,要完整做出一把刀,还需要做出刀套。也就是说,在进行某道工序前,需要先完成某 些其他的工序。而且某道工序也有他制作的时间,虽然giroro有惊人的毅力(也就是说你可以认为giroro可以在同一个时间内进行无数道工序),但是 制作一个武器还是有它的最短时间的!
现在great_dragon_master已经把同一个武器的工序编好号,而且给出各道工序的时间,以及它们之间的先后关系。PS:如果说没有给出某两个工序的先后关系,也就是谁先做也没所谓,或者可以同时做,反正giroro是可以的。
giroro命令你算出每个武器最少的完成时间!
ps:保证这个武器可以制造出来,而且保证编号为n的工序是这个武器的最后一道工序。

Input

一个整数T(T<=1000),表示接下来又多少个武器需要制作。
接下来的T组:
每组的第一行两个整数n(1<=n<=100)和m(0<=m<=1000)分别表示这个武器的工序个数和工序关系的个数。
第二行有n个数,a[i]表示第i道工序所需要的时间(1<=a[i]<=100)。
接下来m行,每行两个数,x y(1<=x,y<=n),表示编号为y的工序开始之前,编号为x的工序必须完成。
请使用scanf代替cin来避免超时

Output

对于每个武器,输出其最少所需要的完成时间。

Sample Input

1
4 4
1 1 1 1
1 2
1 3
2 4
3 4

Sample Output

3

广工暑假培训选拔赛的题目,用树状dp,当时 不会,但想到了一条公式dp[n]=dp[n的前提]+t[n]代表完成n的时间。
然后写了个dpit(n)函数来找寻n的时间,实际上貌似是用了dfs后回溯dp选取,具体要看程序来了解了。
dpit(x)的原理就是不断寻找的前提,如果他又前提k就dpit(k)来找k的时间,知道某个已经被查找过或者是没有前提的,就return回来。
View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define max(a,b) a>b?a:b
 6 #define min(a,b) a>b?b:a
 7 #define INF     0x3f3f3f3f
 8 #define Maxin 10000
 9 int fang[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
10 int s[112][112],dp[112];
11 int t[111],ans;
12 int n,m;
13 
14 int dpit(int k)
15 {
16     int x;
17     if(dp[k]!=0)
18         return dp[k];
19 
20     for(x=1;x<=n;x++)
21         if(s[x][k])
22            dp[k]=max(dp[k],dpit(x));
23  
24         dp[k]+=t[k];
25         return dp[k];
26 }
27 
28 int main()
29 {
30     int T;
31     scanf("%d",&T);
32     while(T--)
33     {
34         int x,y;
35         ans=0;
36         memset(dp,0,sizeof(dp));
37         memset(s,0,sizeof(s));
38         scanf("%d%d",&n,&m);
39         for(x=1;x<=n;x++)
40             scanf("%d",&t[x]);
41         for(x=0;x<m;x++)
42         {
43             int i,j;
44             scanf("%d%d",&i,&j);
45             s[i][j]=1;
46         }
47 
48         for(x=1;x<=n;x++)
49                 dp[x]=dpit(x);
50 
51         for(x=1;x<=n;x++)
52             if(ans<dp[x])
53                 ans=dp[x];
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

 



posted on 2012-06-11 19:19  usp10  阅读(272)  评论(1编辑  收藏  举报

导航