问题标题: 酷町堂:5583 营救家人(save)

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

北境统领史塔克家族的部分家人被兰尼斯特家族软禁。为了营救家人,北境之王罗柏●史塔克准备率领众多北境领主攻伐兰尼斯特家族。北境共有n个领主,每个领主都住在自己的城堡里面,每个城堡都屯有一定数量的士兵。 由于地形、经济条件等原因,只有部分城堡之间有道路连接。罗柏●史塔克想汇总领主的兵力,他可以选择从任一城堡出发,并沿着道路向后面的城堡进发(从第i号城堡只能向第i+1到第n号城堡进发),当没有后续城堡时,完成兵力的集中。请你设计一个汇总兵力的方案,使得罗柏.史塔克能集中最多的兵力。

输入描述 Input Description

有n+1行。第1行只有一个数字,表示城堡的个数n。第2行有n个数,分别表示每个城堡中的士兵个数。第3行至第n+1行表示城堡之间的道路连接情况,0表示没有道路,1表示有道路。如第3行有n-1个数,表示第1个城堡至第2个、第3个、.第n个城堡是否有道路连接。后面以此类推。

输出描述 Output Description

有两行数据。第一行表示最优方案中访问城堡序号的排列,各序号间以一个空格分隔,没有多余的空格。第二行只有一个数,表示能集中到的最多的士兵数量。

 

爆0了

#include<iostream>
#include<bits/stdc++.h>
#pragma GCC optimize(3) 
using namespace std;
int n,ans,s;
int vis[25],path[25],a[25],f[25];
bool dis[25][25];
void dfs(int pos,int sum,int cnt){
    if(sum>ans){
        ans=sum;
        for(int i=1;i<=cnt;i++) path[i]=vis[i];
        s=cnt;
    }
    if(sum+f[pos]<ans) return ;
    vis[cnt]=pos;
    sum+=a[pos];
    for(int i=pos+1;i<=n;i++){
        if(dis[pos][i]){
            vis[cnt+1]=i;
            dfs(i,sum+a[i],cnt+1);
            vis[cnt+1]=0;
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=n;i>=1;i--){
        f[i]=f[i+1]+a[i];
    }
    for(int i=1;i<=n-1;i++){
        int pos=i+1;
        for(int j=1;j<=n-i;j++){
            int x;
            cin>>x;
            dis[i][pos]=dis[pos][i]=x;
            pos++;
        }
    }
    dfs(1,0,0);
    cout<<1<<" ";
    for(int i=1;i<=s;i++){
        cout<<path[i]<<" ";
    }
    cout<<endl<<ans;
    return 0;
}

 


0
已采纳
郑金顺
郑金顺
中级光能
中级光能
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,num[55],g[55][55];
int f[55];
int dfs(int n){
    if(f[n]!=-1) return f[n];
    int ans=0;
    for(int i=1;i<n;i++){
        if(g[i][n]) ans=max(ans,dfs(i));
    }
    return f[n]=ans+num[n];
} 
int main(){
    //freopen("xxx.in","r",stdin);
    //freopen("xxx.out","w",stdout);
    memset(f,-1,sizeof(f));
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>num[i];
    }
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            cin>>g[i][j];
        }
    }
    cout<<dfs(n);
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

 

0
周琪岳
周琪岳
资深光能
资深光能

1.万能头不是好习惯

2.O3不是好习惯

周琪岳在2021-04-07 21:10:38追加了内容

我也才50

0
吕易航
吕易航
资深守护
资深守护

我不会

你搞火车头干啥?

0
李显晨
李显晨
中级启示者
中级启示者

主函数:

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>>w[i][j];
    for(int i=1;i<=n;i++){
        f[i]=a[i];
        for(int j=1;j<i;j++)
            if(w[j][i]&&f[j]+a[i]>f[i]){
                f[i]=f[j]+a[i];
                hs[i]=j;
            }
        if(f[i]>ANS){
            ANS=f[i];
            ans=i;
        }
    }
    dfs(hs[ans]);
    cout<<ans<<endl<<ANS;

函数:

void dfs(int x){
    if(x<1) return ;
    dfs(hs[x]);
    cout<<x<<' ';
}

定义:

int n,a[25],xc[25],ANS,ansn,f[25],hs[25],ans;
bool w[25][25];

 

0
0
0
谭迪元
谭迪元
资深光能
资深光能

 

int n,a[25],xc[25],ANS,ansn,f[25],hs[25],ans;

bool w[25][25];

void dfs(int x){

if(x<1) return ;

dfs(hs[x]);

cout<<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>>w[i][j];

for(int i=1;i<=n;i++){

f[i]=a[i];

for(int j=1;j<i;j++)

if(w[j][i]&&f[j]+a[i]>f[i]){

f[i]=f[j]+a[i];

hs[i]=j;

}

if(f[i]>ANS){

ANS=f[i];

ans=i;

}

}

dfs(hs[ans]);

cout<<ans<<endl<<ANS;


 

 

 

hh

我要回答