挖地雷
题目给出的是单向边
转移的时候判断一下是否有连边
记录一下路径
//P2196 挖地雷 #include<bits/stdc++.h> using namespace std; int n; int c[205],a[205],dp[205],g[205][205],t,ans; inline void print(int x){ if(c[x]==0){ printf("%d",x); return ; } print(c[x]); printf(" %d",x); } int main(){ cin>>n; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); dp[i]=a[i]; } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ scanf("%d",&g[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<n;j++){ if(g[j][i]){ if(dp[i]<dp[j]+a[i]){ dp[i]=dp[j]+a[i]; c[i]=j; } } } // dp[i]+=a[i]; if(dp[i]>ans){ ans=dp[i]; t=i; } } print(t); printf("\n%d",ans); return 0; }