Partition problem 暴力+复杂度计算+优化

题意

2n个人分成两组。给出一个矩阵,如果ab两个在同一个阵营,那么就可以得到值\(v_{ab}\)求如何分可以取得最大值 (n<14)

分析

经过复杂度计算我们可以算出28!2828过⑧了,但是28!28可以过,所以我们思考一下怎么优化计算阵营值得过程。可以考虑一种dp得思想,当选择这个人进A阵营时,后面所以得人进A阵营都会得到A得值,所以只要把这个人的贡献加到后面所有可选择的人的进A阵营的贡献即可,每次选一个人的时候,只要把当前的人选择的阵营的贡献加上即可。这样就可以O(N)算出贡献来了。这题的主要难点就是复杂度计算和算贡献的优化

#include<bits/stdc++.h>
#define F first
#define S second
#define pii pair<int,int>
#define pb push_back
#define mkp make_pair
#define all(zzz) (zzz).being(),(zzz).end()
#define pii pair<long long ,int>
typedef long long ll;
typedef long long LL;
using namespace std;
const int maxn=1e3+4;
ll mp[maxn][maxn];
ll dp[maxn][3];
int vis[maxn];
long long ans=0;
int n;
void dfs(int step,int cnta,int cntb,long long tmp){
if(step==2*n+1){
ans=max(ans,tmp);
}
if(cnta<n){
for(int i=step+1;i<=2*n;i++)
dp[i][2]+=mp[i][step];
dfs(step+1,cnta+1,cntb,tmp+dp[step][1]);
for(int i=step+1;i<=2*n;i++)
dp[i][2]-=mp[i][step];
}
if(cntb<n){
for(int i=step+1;i<=2*n;i++)
dp[i][1]+=mp[i][step];
dfs(step+1,cnta,cntb+1,tmp+dp[step][2]);
for(int i=step+1;i<=2*n;i++)
dp[i][1]-=mp[i][step];
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n*2;i++){
for(int j=1;j<=2*n;j++)scanf("%lld",&mp[i][j]);
}
dfs(1,0,0,0);
cout<<ans<<endl;
return 0;
}

2019牛客多校第二场F Partition problem 暴力+复杂度计算+优化的更多相关文章

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

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

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

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

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

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

  4. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

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

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

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

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

  7. [2019牛客多校第二场][A. Eddy Walker]

    题目链接:https://ac.nowcoder.com/acm/contest/882/A 题目大意:圆上有\(n\)个点,标号从\(0\)到\(n-1\),初始一个人在点\(0\),每次会等概率向 ...

  8. [2019牛客多校第二场][E. MAZE]

    题目链接:https://ac.nowcoder.com/acm/contest/882/E 题目大意:有一个\(n\times m\)的01矩阵,一开始可以从第一行的一个点出发,每次可以向左.向右. ...

  9. 优化剪枝搜索——牛客多校第二场F

    试了很多种爆搜和剪枝,最后发现还是状压的比较好用 #include <bits/stdc++.h> using namespace std; // #define IO #define f ...

随机推荐

  1. springMVC项目配置文件

    一.springMVC项目配置文件 1.web.xml文件全局配置 <servlet> <servlet-name> dispatcher </servlet-name& ...

  2. 解决shell 报错:syntax error: unexpected end of file

    debug  shell:执行 sh -x test.sh vi test.sh :set fileformat=unix :wq解决问题原因是我在windows pycharm 写的格式不符合uni ...

  3. nodepad++ | 变成 _

    点击右下角切换

  4. 【C语言】求s(n)=a+aa+aaa+...+aa...a的值

    原理:比如a=2,s(1)=2,s(2)=2+2*10+2,s(3)=2+2*10+2+(2*10+2)*10+2   ..... 规律: item=item*10+a sum=sum+item 代码 ...

  5. centos7重启Mysql命令

    执行命令/etc/init.d/mysql restart重启Mysql服务器

  6. Wannafly Camp 2020 Day 3A 黑色气球

    #include <bits/stdc++.h> using namespace std; int a[1005][1005],n,x[1005]; int main() { scanf( ...

  7. java序列化与反序列化的使用

    个人博客 地址:http://www.wenhaofan.com/article/20180925214701 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字 ...

  8. 【做题笔记】洛谷P1506 拯救oibh总部

    跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ...

  9. JS调用函数的两种方式

    <script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...

  10. ApiBehaviorOptions 统一模型验证配置不生效

    ApiBehaviorOptions 的统一模型验证配置一定要放到(.AddMvc)后面.