P2196 [NOIP1996 提高组] 挖地雷 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路来自题解
c[i]为第i个地方的最多地雷数
状态转移方程:c[i]=max{c[j]}+a[i];(j=1,2,3,...,n)(b[i][j]=1 or b[j][i]=1)
#include<bits/stdc++.h>
using namespace std;
#define lint long long
int n,a[100],b[100][100],c[100],d[100],ans=0,ed;
void process(int p){
int e[100],x=1,y;
e[x]=p;
while(d[e[x]]){
x++;
e[x]=d[e[x-1]];
}
for(int i=x;i>0;i--) cout << e[i] <<' ';
}
int main(){
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<n;i++)
for(int j=1;j<=n-i;j++){
cin >> b[i][i+j];
b[i+j][i]=b[i][i+j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(b[i][j] && c[j]>c[i]){
c[i]=c[j];
d[i]=j;
}
c[i]+=a[i];
if(c[i]>ans) {
ans=c[i];
ed=i;
}
}
process(ed);
cout << '\n' << ans;
return 0;
}