题目传送门
解题思路:
记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!!
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(" %d",ans); 49 50 51 return 0; 52 }
//NOIP提高1996 T3