洛谷 P2196 挖地雷

题目传送门

解题思路:

记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!!

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int n,a[21],way[21],ans = -111,en[21],ww;
 8 bool g[21][21],vis[21];
 9 
10 inline void to(int x) {
11     for(int i = 1;i <= x; i++)
12         en[i] = way[i];
13 }
14 
15 inline void dfs(int x,int len,int deep) {
16     way[deep] = x;
17     if(len > ans) {
18         ans = len;
19         to(deep);
20         ww = deep;
21     }
22     for(int i = 1;i <= n; i++) {
23         if(g[x][i] && !vis[i]) {
24             vis[i] = 1;
25             dfs(i,len + a[i],deep+1);
26             vis[i] = 0;
27         }
28     }
29 }
30 
31 int main() {
32     scanf("%d",&n);
33     for(int i = 1;i <= n; i++)
34         scanf("%d",&a[i]);
35     for(int i = 1;i <= n; i++)
36         for(int j = i + 1;j <= n; j++) {
37             int u;
38             scanf("%d",&u);
39             if(u == 1) g[i][j] = 1;
40         }
41     for(int i = 1;i <= n; i++) {
42         memset(vis,0,sizeof(vis));
43         vis[i] = 1;
44         dfs(i,a[i],1);    
45     }
46     for(int i = 1;i <= ww; i++)
47         printf("%d ",en[i]);
48     printf("\n%d",ans);
49     
50     
51     return 0;
52 } 

//NOIP提高1996 T3

posted @ 2019-11-13 22:06  Mr^Simon  阅读(119)  评论(0编辑  收藏  举报