codevs 5294 挖地雷

5294 挖地雷

 

 时间限制: 1 s
 空间限制: 1000 KB
 题目等级 : 黄金 Gold
 
题目描述 Description

在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从第一个地窖开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入描述 Input Description

输入文件mine.in有若干行。

第1行只有一个数字,表示地窖的个数N。

第2行有N个数,分别表示每个地窖中的地雷个数。

第3行至第N+1行表示地窖之间的连接情况:

第3行有n-1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为1 1 0 0 0 … 0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

第4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

… …

第n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

 

输出描述 Output Description

输出文件wdl.out有两行数据。

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

 

样例输入 Sample Input

   

5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1

 

样例输出 Sample Output

   

1 3 4 5
27

 

数据范围及提示 Data Size & Hint

(N<=20)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 long f[201]= {0},w[201],c[201]= {0};
 6 bool a[201][201]= {0};
 7 int main() 
 8 {
 9     long i,j,n,x,y,l,k,maxx;
10     cin>>n;
11     for 
12     (i=1;i<=n;i++)
13     cin>>w[i];                             
14     for(i=n-1;i>=1;i--) 
15     {
16         l=0;
17         k=0;
18         for(j=i+1;j<=n;j++)
19         if(a[i][j]&&f[j]>l) 
20         {
21             l=f[j];
22             k=j;
23         }
24         f[i]=l+w[i];
25         c[i]=k;
26     }
27     k=1;
28     for(j=2;j<=n;j++)
29     if(f[j]>f[k])
30     k=j;
31     maxx=f[k];
32     while (k!=0) 
33     { 
34         cout<<k<<" ";
35         k=c[k];
36     }
37     cout<<endl;
38     cout<<maxx<<endl;
39 }

 

posted @ 2017-04-25 21:50  zzzzx  阅读(160)  评论(0编辑  收藏  举报