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

#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. oracle hint 强制索引(转)

    oracle 1.建议建立一个以paytime,id,cost的复合索引.光是在paytime上建立索引会产生很多随机读.2.就算建立了索引,如果你查询的数据量很大的话,也不一定会用索引,有时候全表扫 ...

  2. linux crontab 计划任务脚本

    在LINUX中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出. 在LINUX中,周期执行的任务一般由cron ...

  3. ajax json jQuery提示parsererror错误解决办法

    $.ajax({ type:'POST', url:'<%=basePath%>/xxx.do', dataType:'JSON', data:{ }, success:function( ...

  4. Python爬虫实战—— Request对象之header伪装策略

    在header当中,我们经常会添加两个参数--cookie 和 User-Agent,来模拟浏览器登录,以此提高绕过后台服务器反爬策略的可能性. User-Agent获取 User-Agent可通过随 ...

  5. vue 运行项目时,Uncaught (in promise) DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

    npm  run dev 运行项目后 验证码显示不出来 并报错 Uncaught (in promise) DOMException: Failed to execute 'open' on 'XML ...

  6. luoguP2590 [ZJOI2008]树的统计 [树链剖分] [TLE的LCT]

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  7. 【2017 Multi-University Training Contest - Team 8】Hybrid Crystals

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6140 [Description] 等价于告诉你有n个物品,每个物品的价值为-a[i]或a[i],或 ...

  8. python之-sqlite3

    在这些 URL 中,hostname 表示 MySQL 服务所在的主机,可以是本地主机(localhost),也可以是远程服务器.数据库服务器上可以托管多个数据库,因此 database 表示要使用的 ...

  9. python pandas  使用列表快速创建数据 用于测试

    创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...

  10. Windows驱动_WFP之一WFP是什么

    现在的网络安全问题,越来越受到重视,微软在VISTA以后,使用了WFP平台来代替之前XP和03中的基于包过滤的技术,比如Transport Driver Interface(TDI)过滤,Networ ...