解法1:循环
#include<bits/stdc++.h>
using namespace std;
int a[21],b[21][21],e[21],nxt[21],n,ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) cin>>b[i][j];
for(int x=n;x>=1;x--){
int res=0;
for(int i=x+1;i<=n;i++){
if(b[x][i] && e[i]>res){
nxt[x]=i;
res=e[i];
}
}
e[x]=a[x]+res;
}
int p=0;
for(int i=1;i<=n;i++){
if(ans<e[i]){
ans=e[i];
p=i;
}
}
while(p!=0){
cout<<p<<" ";
p=nxt[p];
}
cout<<endl<<ans;
return 0;
}
解法2:递推
//从x地窖出发能够获得的最大地雷数
#include<bits/stdc++.h>
using namespace std;
int a[21],b[21][21],e[21],nxt[21],n,ans;
int g(int x){
if(e[x]==0){
int res=0;
for(int i=x+1;i<=n;i++)
if(b[x][i]){
if(g(i)>res){
nxt[x]=i;
res=g(i);
}
}
e[x]=res+a[x];
}
return e[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) cin>>b[i][j];
int p=0;
for(int i=1;i<=n;i++)
if(ans<g(i)){
ans=g(i);
p=i;
}
while(p!=0){
cout<<p<<" ";
p=nxt[p];
}
cout<<endl<<ans;
return 0;
}
解法3:暴力搜索
暴力搜索
#include<bits/stdc++.h>
using namespace std;
long long a[21],b[21][21],n,ans=0,c[21],c1[21],ans1=0,k,k1;
void dfs(int x){
k1++;
c1[k1]=x;
ans1+=a[x];
if(ans1>ans){
ans=ans1;
k=k1;
for(int i=1;i<=k;i++) c[i]=c1[i];
}
for(int i=x+1;i<=n;i++) if(b[x][i]==1) dfs(i);
c1[k1]=0;
k1--;
ans1-=a[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) cin>>b[i][j];
for(int i=1;i<=n;i++) dfs(i);
for(int i=1;i<=k;i++) cout<<c[i]<<" ";
cout<<endl<<ans;
return 0;
}