问题标题: 酷町堂:6401求助

0
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
林鄧天樂
林鄧天樂
初级光能
初级光能

对不起帮不了你我才60分

0
0
0
程安琪
程安琪
资深守护
资深守护

我对了,用vector做的,(能发完整代码吗??)

0
程安琪
程安琪
资深守护
资深守护

如果能,我可以尝试发一下我的代码

0
0
我要回答