zoukankan      html  css  js  c++  java
  • 2019牛客多校第二场F Partition problem 暴力+复杂度计算+优化

    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;
    }
    
  • 相关阅读:
    jQuery为链接添加链接图像
    jQuery插件Toggle text value
    用ajax清除浏览器缓存的js、css、图片等
    Ajax 解决ie缓存问题
    jQuery插件slidergallery.(仿MAC展示.)
    javascript计算器Calculator
    回车自动提交内容
    个性化表单五技巧
    教你怎么样用CSS和图片做搜索框.
    浅谈css框架开发
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/11394910.html
Copyright © 2011-2022 走看看