19牛客多校2-F(DFS,权值计算散步于过程中以优化时间)

Partition problem

https://ac.nowcoder.com/acm/contest/882/F

输出描述:

Output one line containing an integer representing the answer.

示例1

输入

1
0 3
3 0

输出

3



题意:
给定2n个人,每两个人间存在一个竞争值,题目要求将这2n个人划分为人数相同的两组(即每组n人),记分好组的情况下所有的无序对(x,y)(x, y来自不同组) 产生的的和为F,本题即求最小的F为多少。

分析:
自然想到要枚举子集,倘若单纯地考虑每一元素 放/不放 在组1中,并在 组1/组2 放满后进行统计&更新最优值,则复杂度O(C(2N,N)*N^2),显然会T。
考虑设置两个集合(数组),分别存放已分配进组1的人和已分配进组2的人,则dfs遍历到某一个人时,两种选择——放入组1/组2,每一个选择下此人所贡献的权值即为他与相对组的已分配集合中所有人的竞争值得和,这样对于每一个二元对(i,j),二元对产生的权总会在 二元对中较晚被遍历到的人被遍历时 所统计。同时,权值的和的计算分解在dfs的过程中而不是在最后到达叶边界时统计可以减去重复的计算(即搜索树以根开始的某一段前缀 在其对应到不同叶节点时,这段前缀不会被重复计算),这样应该可以显著优化搜索带来的常数,貌似复杂度可达 O(C(2N,N)*N)

代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,c[30][30];
ll ans;
vector<int> a,b;
void dfs(int u,int num,ll s){
    int i,j;
    ll sum=s;
    if(num==n){
        for(i=u;i<=2*n;i++){//组1已满,剩余的人分入组2并统一计算权值
            for(j=0;j<a.size();j++)
                s+=c[i][a[j]];
        }
        ans=max(ans,s);
        return ;
    }
    else if(u-1-num==n){
        for(i=u;i<=2*n;i++){//组2已满,剩余的人分入组1并统一计算权值
            for(j=0;j<b.size();j++)
                s+=c[i][b[j]];
        }
        ans=max(ans,s);//更新最优值
        return ;
    }
// join in Group1
    sum=s; a.push_back(u);
    for(i=0;i<b.size();i++)//计算贡献
        sum+=c[u][b[i]];
    dfs(u+1,num+1,sum); a.pop_back();
// join in Group2
    sum=s; b.push_back(u);
    for(i=0;i<a.size();i++)//计算贡献
        sum+=c[u][a[i]];
    dfs(u+1,num,sum); b.pop_back();
}
int main(){
    int t,i,j,k;
    cin>>n;
    for(i=1;i<=2*n;i++){
        for(j=1;j<=2*n;j++)
            scanf("%d",&c[i][j]);
    }
    dfs(1,0,0);
    cout<<ans;
    return 0;
}



全部评论

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务