试了很多种爆搜和剪枝,最后发现还是状压的比较好用

#include <bits/stdc++.h>
using namespace std;
// #define IO
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define rep(i,s,t) for(int i=s;i<t;i++)
#define REP(i,s,t) for(int i=s;i<=t;i++)
#define DOW(i,s,t) for(int i=s;i>=t;i--)
#define dow(i,s,t) for(int i=s;i>t;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define debug(x) cout<<#x<<' '<<x<<endl typedef long long ll;
typedef pair<int,int>pii;
inline int lowbit(int x){ return x&(-x); }
template<typename T>
inline void read(T&x){
x=;int f=;char ch=getchar();
while(ch<'' ||ch>''){ if(ch=='-')f=-; ch=getchar(); }
while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar(); }
x*=f;
}
const int N = ;
ll g[N][N];
ll n,ans; void dfs(int mask,int num,int pre,ll preans){
if(num<<==n){
ans=max(ans,preans);return;
}
if(n--pre+num<n/)return; //表示即使是接下来的所有数都选,也不符合条件(集合不能够选够n/2个元素),就直接返回(最优性剪枝)
for(int i=pre+;i<n;i++){
ll nowans=preans;
rep(j,,n){
if(mask&(<<j))nowans-=g[i][j];
else nowans+=g[i][j];
}
dfs(mask|(<<i),num+,i,nowans);
}
}
int main(){
cin>>n;n<<=;
rep(i,,n) rep(j,,n) read(g[i][j]);
ll nowans=; //现在将第一个点放到另一个集合中
rep(i,,n)nowans+=g[][i];
dfs((<<),,,nowans);
printf("%lld\n",ans);
return ;
}

然后还有一种不同思路的搜索,一开始两个集合都为空,然后往两个集合里填元素,这样会少很多冗余的搜索

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,vis[],mp[][],ans; int s1[],s2[],top1,top2;
void dfs(int pos,ll now){
if(pos>*n){
ans=max(ans,now);
return;
}
if(top1<n){
s1[++top1]=pos;
ll nxt=now;
for(int i=;i<=top2;i++)
nxt+=mp[pos][s2[i]];
dfs(pos+,nxt);
top1--;
}
if(top2<n){
s2[++top2]=pos;
ll nxt=now;
for(int i=;i<=top1;i++)
nxt+=mp[pos][s1[i]];
dfs(pos+,nxt);
top2--;
}
} int main(){
cin>>n;
for(int i=;i<=*n;i++)
for(int j=;j<=*n;j++)
scanf("%d",&mp[i][j]);
ans=;
dfs(,);
cout<<ans<<endl;
}
/*
(28,14)=
*/

优化剪枝搜索——牛客多校第二场F的更多相关文章

  1. 2019牛客多校第二场F Partition problem 暴力+复杂度计算+优化

    Partition problem 暴力+复杂度计算+优化 题意 2n个人分成两组.给出一个矩阵,如果ab两个在同一个阵营,那么就可以得到值\(v_{ab}\)求如何分可以取得最大值 (n<14 ...

  2. 2019年牛客多校第二场 F题Partition problem 爆搜

    题目链接 传送门 题意 总共有\(2n\)个人,任意两个人之间会有一个竞争值\(w_{ij}\),现在要你将其平分成两堆,使得\(\sum\limits_{i=1,i\in\mathbb{A}}^{n ...

  3. 2019牛客多校第二场F Partition problem(暴搜)题解

    题意:把2n个人分成相同两组,分完之后的价值是val(i, j),其中i属于组1, j属于组2,已知val表,n <= 14 思路:直接dfs暴力分组,新加的价值为当前新加的人与不同组所有人的价 ...

  4. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  5. 牛客多校第二场A run(基础DP)

    链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...

  6. run (牛客多校第二场)计数DP

    链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 题目描述 White Cloud is exercising in the playground ...

  7. 2019牛客多校第二场F-Partition problem(搜索+剪枝)

    Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...

  8. 2019 牛客多校第二场 H Second Large Rectangle

    题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...

  9. 2019牛客多校第二场H-Second Large Rectangle

    Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...

随机推荐

  1. Delphi中的线程类(转)

    Delphi中的线程类 (转) Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下 ...

  2. git——修改已经提交并push后的commit注释

    把代码push到远程后,发现commit的注释居然多了几个错别字,不行,必须改了! 搜索了一些答案之后自己做了一个总结如下: ①修改倒数第次的commit 指令:$ git rebase -i HEA ...

  3. redis-config.properties属性资源文件

    redis.host=192.168.200.128redis.port=6379redis.pass=redis.database=0redis.maxIdle=300redis.maxWait=3 ...

  4. Linux常用命令入门文件、网络、系统及其他操作命令

    Linux常用命令入门文件.网络.系统及其他操作命令.压缩 归档 文件系统 系统管理 用户管理  网络管理 finger 相关命令 netstat ping rsh telnet wget 进程管理等 ...

  5. 单调栈+线段树——cf1220F

     首先考虑初始排列,pi会让周围所有比其大的元素深度+1,所以要求每个点的深度,只要其被覆盖了几次即可 这个覆盖可以通过处理每个元素的左右边界(单调栈O(n))+线段树区间更新(Ologn(n))来做 ...

  6. phpmyadmin利用的多种方式

    关于phpmyadmin的利用方式大佬们已经总结的很好了,这里只是造轮子(便于记录学习) 确认版本 渗透测试信息搜集永远是首位(也是最重要的一步).     默认目录/doc/html/index ...

  7. <iframe>框架标签的使用

    同源下 1.iframe属性设置参考:https://blog.csdn.net/xiyiyindie/article/details/53415158 2.父子页面之间元素相互操作:https:// ...

  8. 使用Objective-C的+(void)initialize初始化static变量

    在<Objective C类方法load和initialize的区别>一文中,我介绍了Objective-C对待+(void)initialize和+(void)load两个方法在编译和执 ...

  9. .net 实用小技巧

    Linq 实现in查询 Dictionary<int, IP> dict = new Dictionary<int, IP>(); dict.Add(1, new IP(&qu ...

  10. Java获取CPU占用率

    原文链接:https://www.jianshu.com/p/015cc4805e29 最近做一个Java性能统计的问题,需要统计当前进程占用CPU的情况,最开始使用Java MxBean来获取 Op ...