优化剪枝搜索——牛客多校第二场F
试了很多种爆搜和剪枝,最后发现还是状压的比较好用
#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的更多相关文章
- 2019牛客多校第二场F Partition problem 暴力+复杂度计算+优化
Partition problem 暴力+复杂度计算+优化 题意 2n个人分成两组.给出一个矩阵,如果ab两个在同一个阵营,那么就可以得到值\(v_{ab}\)求如何分可以取得最大值 (n<14 ...
- 2019年牛客多校第二场 F题Partition problem 爆搜
题目链接 传送门 题意 总共有\(2n\)个人,任意两个人之间会有一个竞争值\(w_{ij}\),现在要你将其平分成两堆,使得\(\sum\limits_{i=1,i\in\mathbb{A}}^{n ...
- 2019牛客多校第二场F Partition problem(暴搜)题解
题意:把2n个人分成相同两组,分完之后的价值是val(i, j),其中i属于组1, j属于组2,已知val表,n <= 14 思路:直接dfs暴力分组,新加的价值为当前新加的人与不同组所有人的价 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 牛客多校第二场A run(基础DP)
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言2621 ...
- run (牛客多校第二场)计数DP
链接:https://www.nowcoder.com/acm/contest/140/A来源:牛客网 题目描述 White Cloud is exercising in the playground ...
- 2019牛客多校第二场F-Partition problem(搜索+剪枝)
Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...
- 2019 牛客多校第二场 H Second Large Rectangle
题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目大意 给定一个 n * m 的 01 矩阵,求其中第二大的子矩阵,子矩阵元素必须全部为 1.输出其大小 ...
- 2019牛客多校第二场H-Second Large Rectangle
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...
随机推荐
- oracle入门学习之oracle数据库结构
1. oracle数据库结构 1.1 Oracle可以看做是一个大的数据库???,里面可以创建很多实例; 一个实例对应多个表空间.多个用户; 一个用户只能有一个表空间; 一个表空间可以有多个用户; 一 ...
- Java里的参数类型/返回值类型
参数类型/返回值类型: ##数据类型: ###基本类型: ###引用类型: ####数组 ####类 ####接口 参数类型/返回值类型是类和接口的情况: 1.参数类型是普通类的情况 为什么写成静态, ...
- pc端与移动端适配解决方案之rem
使用方式: 在html页面开头,引入下面的原生js代码 (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'ori ...
- Java/sql找出oracle数据库有空格的列
1.java方式 String table_sql = "select table_name from user_tables";//所有用户表 List<String> ...
- python语法学习
global关键字(内部作用域想要对外部作用域的变量进行修改) decator装饰器,说白了就是一个函数指针的传递 *arg,**kwarg, 分别为tuple,dic传递
- webstorm使用说明
1.移动光标到的代码块的结尾处(开始处 [ ) ctrl+] 2.移动光标到的代码块的结尾处并选择 ctrl+shift+] 3.ctrl + b: 跳到变量申明处 4.多光标输入: ...
- Ext 面板(Panel)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php开发面试题---2、php常用面试题二(表单提交方式中的get和post有什么区别)
php开发面试题---2.php常用面试题二(表单提交方式中的get和post有什么区别) 一.总结 一句话总结: 数据位置:get参数在url里面,post在主体里面 数据大小:get几kb,pos ...
- AntiPlug
反插件工程 #pragma once #ifndef __ENHANFUNC_H__ #define __ENHANFUNC_H__ #include <iostream> #includ ...
- 资源-.Net-ASP.NET:ASP.NET资源列表
ylbtech-资源-.Net-ASP.NET:ASP.NET资源列表 ASP.NETFree. Cross-platform. Open source.A framework for buildin ...