传送门


首先$C_i$是没有意义的,因为可以直接让$d_i \times= C_i$,答案也是一样的

所以我们现在考虑求$(\sum_{i=1}^{K-1} |d_{p,i}-d_{q,i}|) - |d_{p,K} - d_{q,K}|$的最大值

这个绝对值好烦人啊qaq

我们考虑如何消去这个绝对值

先抛开第$K$项,假设我们要计算$\sum_{i=1}^{K-1} |d_{p,i}-d_{q,i}|$的最大值

可以发现$\sum_{i=1}^{K-1} |d_{p,i}-d_{q,i}| = max(\sum_{i=1}^{K-1} (d_{p,i}-d_{q,i}) \times (-1)^{a_i})=max(\sum_{i=1}^{K-1} d_{p,i} \times (-1)^{a_i} + d_{q,i} \times (-1)^{a_i + 1})$

其中$0 \leq a_i \leq 1$且取遍所有情况

那么我们可以设$dp_j$表示$a_i$状压成二进制表示为$j$时的$\sum_{i=1}^{K-1} d_{p,i} \times (-1)^{a_i}$的最大值,$ind_j$表示$dp_j$取到最大值时的$p$值,转移也比较方便了。

最后我们考虑第$K$维的影响,我们不妨按照第$K$维从小到大排序,那么$dp_j$表示$a_i$状压成二进制表示为$j$时的$\sum_{i=1}^{K-1} d_{p,i} \times (-1)^{a_i} + d_{K,i}$的最大值,最后统计答案时再减去当前的$d_K$值就可以了

 #include<bits/stdc++.h>
 //This code is written by Itst
 using namespace std;

 inline int read(){
     ;
     char c = getchar();
     ;
     while(!isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 ;
 ] , dir[] , C[];
 int N , K , ans , ind1 , ind2;
 struct ani{
     ] , ind;
     bool operator <(const ani a)const{
         ] < a.val[K - ];
     }
 }now[MAXN];

 inline int calc(int d , int type){
     ;
      ; i < K -  ; ++i)
         sum += (type & ( << i) ?  : -) * now[d].val[i];
     return sum;
 }

 int main(){
 #ifndef ONLINE_JUDGE
     freopen("in" , "r" , stdin);
     //freopen("out" , "w" , stdout);
 #endif
     N = read();
     K = read();
      ; i < K ; ++i)
         C[i] = read();
      ; i <= N ; ++i){
          ; j < K ; ++j)
             now[i].val[j] = read() * C[j];
         now[i].ind = i;
     }
     sort(now +  , now + N + );
      ; i <  << (K - ) ; ++i){
         dir[i] = now[].ind;
         dp[i] = calc( , i) + now[].val[K - ];
     }
      ; i <= N ; ++i){
          ; j <  << (K - ) ; ++j){
              << (K - )) -  - j;
             ] > ans){
                 ans = t + dp[d] - now[i].val[K - ];
                 ind1 = now[i].ind;
                 ind2 = dir[d];
             }
         }
          ; j <  << (K - ) ; ++j)
             ]){
                 dp[j] = calc(i , j) + now[i].val[K - ];
                 dir[j] = now[i].ind;
             }
     }
     cout << ind1 << ' ' << ind2 << endl << ans;
     ;
 }

Luogu4131 WC2005 友好的生物 状压DP的更多相关文章

  1. BZOJ5068: 友好的生物(状压 贪心)

    题意 题目链接 Sol 又是一道神仙题??.. 把绝对值拆开之后状压前面的符号?.. 下界显然,但是上界为啥是对的呀qwq.. #include<bits/stdc++.h> using ...

  2. 公牛与状压dp

    T1 疾病管理 裸得不能再裸的状压dp 不过数据范围骗人 考试时k==0的点没过 我也很无奈呀qwq #include<iostream> #include<cstdio> # ...

  3. 洛谷U14667 肝活动【比赛】 【状压dp】

    题目描述 Yume 最近在玩一个名为<LoveLive! School idol festival>的音乐游戏.他之所以喜欢上这个游戏,是因为这个游戏对非洲人十分友好,即便你脸黑到抽不出好 ...

  4. 洛谷P3694 邦邦的大合唱站队【状压dp】

    状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...

  5. 状压dp大总结1 [洛谷]

    前言 状态压缩是一种\(dp\)里的暴力,但是非常优秀,状态的转移,方程的转移和定义都是状压\(dp\)的难点,本人在次总结状压dp的几个题型和例题,便于自己以后理解分析状态和定义方式 状态压缩动态规 ...

  6. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  7. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  8. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

随机推荐

  1. Android View体系(二)实现View滑动的六种方法

    1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...

  2. javascript中的异步编程

    正常情况下js都是顺序执行的,但是也有很多场景下实际上是异步操作: 1.定时器都是异步操作 2.事件绑定都是异步操作 3.AJAX中一般我们都采取异步操作(也可以同步) 4.回调函数可以理解为异步(不 ...

  3. jmeter利用自身代理录制脚本

    在利用代理录制脚本时一定要安装java jdk,不然不能录制的. 没有安装过java jdk安装jmeter后打开时会提示安装jdk,但是mac系统中直接打开提示安装jdk页面后下载的java并不是j ...

  4. WindowsErrorCode

    0 操作成功完成.1 功能错误.2 系统找不到指定的文件.3 系统找不到指定的路径.4 系统无法打开文件.5 拒绝访问.6 句柄无效.7 存储控制块被损坏.8 存储空间不足, 无法处理此命令.9 存储 ...

  5. 转:npm安装教程

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  6. js,ajax,layer笔记(弹出层,在弹出一个弹框)

    整体认识: 因为作用域的问题,js 在页面初次加载时已近加载好了,所以要有第二次弹窗的效果,必须得在第一次成功之后再次让他加载js 代码: /*shaun*/showdetailsPag: funct ...

  7. Git永久删除文件和历史记录

    目录 Git永久删除文件和历史记录 使用filter-branch 添加到.gitignore文件里并push修改后的repo 清理和回收空间 Git永久删除文件和历史记录 造成你想从git存储库中永 ...

  8. Head First Android --- Intent

    How to create the intentYou create an intent that specifies an action using the following syntax:whe ...

  9. 记一次ubuntuyu源码安装node.js

    1.官网下载源码 2.下载后解压,在终端打开,并进入文件夹 3../configure 这一步可谓是一波三折,先是没有Python 安装Python 又说没有G++,安装G++后终于成功执行./con ...

  10. python基本数据类型 数字 和 字符串

    一.数字      int type可以查看数据类型 将字符串转换为数字: a=" b=int(a) print(type(a)) 以十六进制或者八进制或者二进制的形式转换为十进制: num ...