0
已解决
张百川
新手光能
新手光能
90分求助!
#include<bits/stdc++.h>
using namespace std;
int n,m,mx,a[55];
bool g[55][55],vis[55];
void dfs(int pos,int cnt){
mx=max(mx,cnt+a[pos]);
vis[pos]=1;
for(int i=1;i<=n;i++){
if(g[pos][i]&&!vis[i]){
dfs(i,cnt+a[pos]);
}
}
return ;
}
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>>g[i][j];
}
}
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
dfs(i,0);
}
cout<<mx;
}
0
已采纳
焦胤轩
新手光能
新手光能
哦我的老同学,我暑假7月就上完了,我给你提一下思路
这道题是图的动态规划,用dfs我没试过,定义一个f数组,一个领接矩阵数组g,一个输入数组a,以上所有数组全部开到55。先从1到n遍历输入a数组。然后是一个双重循环,外层的i从1到n-1,内层j从i+1到n,输入g数组。然后另外一个循环i从1到n,然后在循环内,写f[i]=a[i],这个是边界,然后内层j从1到i-1,内层里面写一个if,条件是g[j][i],意思是从j到i有一条边。if里面写f[i]=max(f[i],f[j]+a[i])
在内层循环外面用ans与f[i]求最大值,最后输出ans即可。
你可以按照我给你的思路写一下O(∩_∩)O~
0
0
0
0
0
0
0