http://hihocoder.com/problemset/problem/1496

题意:中文。

思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时有一个以上的数。

例如样例2可以化成:

001

010

100

101

那么肯定挑选最高位的1(第三位)并且有一个以上的数更优,如果没有一个以上那么与之后会变成0.

那么对于这一位应该如何挑选。

一开始想着只挑选最大的两个,但是造出下面的样例:

1001000

1000110

1000110

这样的样例显然是挑选下面的两个更优。

于是YY出了一种想法,直接往前面扫,对于每一位的1只挑选最大的两个,然后更新答案,最后居然对了。(肯定是数据太水了)。

A了之后想知道为什么,大概和这个有点像吧http://blog.csdn.net/ddjing_/article/details/69072023。。。

 #include <bits/stdc++.h>
using namespace std;
#define N 101000
typedef long long LL;
int num[N];
LL bit[][]; int main() {
int t; scanf("%d", &t);
while(t--) {
memset(bit, , sizeof(bit));
int n; scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &num[i]);
for(int i = ; i <= n; i++) {
int tmp = num[i], cnt = ;
while(tmp) {
if(tmp & ) {
if(bit[cnt][] < num[i]) bit[cnt][] = bit[cnt][], bit[cnt][] = num[i];
else if(bit[cnt][] < num[i]) bit[cnt][] = num[i];
}
cnt++; tmp >>= ;
}
}
LL ans = ;
for(int i = ; i >= ; i--) {
LL now = bit[i][] * bit[i][] * (bit[i][] & bit[i][]);
if(ans < now) ans = now;
}
printf("%lld\n", ans);
}
return ;
}

看了下别人的正解:

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 100010
/* 高维前缀最大次大值
  我们可以枚举x&y的结果z,找出两个数x&y==z使得x*y最大,更新答案即可,
  条件可以被削弱为z为x&y的子集,这种条件放缩不会导致最优解的丢失,
  z为x&y的子集等价于z为x的子集并且z为y的子集。
  那么我们只要找出以z为子集的最大值和次大值,然后枚举z即可计算出答案。
  复杂度O(k*2^k).
*/ struct node {
LL val[];
node operator + (const node &rhs) const {
LL _val[] = {val[], val[]};
for(int i = ; i < ; i++)
if(rhs.val[i] > _val[]) _val[] = _val[], _val[] = rhs.val[i];
else if(rhs.val[i] > _val[]) _val[] = rhs.val[i];
return (node){ _val[], _val[] };
}
} dp[(<<)+]; int main() {
int t; scanf("%d", &t);
int statu = << ;
while(t--) {
for(int i = ; i < statu; i++) dp[i] = (node){, };
int n, a; scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &a), dp[a] = dp[a] + (node){ a, };
for(int i = ; i < ; i++)
for(int j = ; j < statu; j++)
if(( << i) & (~j)) dp[j] = dp[j] + dp[( << i) | j]; // 递推子集
// (1<<i) & (~j) 表示状态j没有(1<<i)这个状态的时候就更新
LL ans = ;
for(int i = ; i < statu; i++)
ans = max(ans, dp[i].val[] * dp[i].val[] * (dp[i].val[] & dp[i].val[]));
printf("%lld\n", ans);
}
return ;
}

HihoCoder 1496:寻找最大值(思维DP)的更多相关文章

  1. hihocoder 1496 寻找最大值(高维前缀最大次大值)

    [题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠ ...

  2. hihocoder 1496 寻找最大值

    题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...

  3. Hihocoder 1496 寻找最大值(状态压缩 + 高位前缀和)

    题目链接  Hiho 1496 设$f[i]$为二进制集合包含$i$的最大的两个数,这个东西用高维前缀和维护. 高位前缀和转移的具体方案 :枚举每一位,然后枚举每个集合,大的转移到小的. 注意合并的时 ...

  4. HihoCoder - 1496:寻找最大值(高维前缀和||手动求子集)

    描述 给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 小Ho当然知道怎么 ...

  5. hihocoder offer收割编程练习赛12 D 寻找最大值

    思路: 可能数据太水了,随便乱搞就过了. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...

  6. hihoCoder 1043 完全背包 (dp)

    http://hihocoder.com/problemset/problem/1043 动态转移方程 :for v=cost..V f[v]=max(f[v],f[v-c[i]]+w[i]); #i ...

  7. Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)

    <题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...

  8. Queue CodeForces - 353D (思维dp)

    https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...

  9. HihoCoder 1033交错和(数位DP第三题)

    (写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...

随机推荐

  1. 汉顺平html5课程分享:6小时制作经典的坦克大战!

    记起自己去年參加的一次面试,在做过Java多年的面试官面前发挥的并不好,但他一听说我会html5,立刻眼睛发亮.无论不顾的想要和我签约.. .所以.如今为工作犯愁的朋友们,学好html5,绝对会为你找 ...

  2. Spring MVC 专题

    Spring静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取.在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,c ...

  3. android studio中使用9-patch报错mergeDebugResource及Duplicate resources错误处理

    由于项目中新导入了两张图片,进行9-patch之后,文件名称包含XXXX.9.png , 而android studio 对资源文件的名称有要求仅支持[A-Z][a-z][0-9]格式  而XXX.9 ...

  4. WPF——TargetNullValue(如何在绑定空值显示默认字符)

    原文:WPF--TargetNullValue(如何在绑定空值显示默认字符) 说明:在数据绑定时,如果有些字段为空值,那么在数据绑定时可以用默认值来显示为空的字段. </Grid> { L ...

  5. 高手问答精选:Go 语言 —— 云计算时代的 C 语言(类似于一个FAQ)

    Go 语言被称为云计算时代的 C 语言,它在软件开发效率和运行效率之间做出了绝佳的权衡.这使得它既适应于互联网应用的极速开发,又能在高并发.高性能的开发场景中如鱼得水.正因如此,许多互联网公司,尤其是 ...

  6. ArcGIS中Python逆地理编码,根据坐标获取实际的地址

    import json import urllib import arcpy def getAddress(lng,lat): url= 'http://restapi.amap.com/v3/geo ...

  7. Excel的Range对象(C#)

    原文:Excel的Range对象(C#) Range 对象是 Excel 应用程序中最经常使用的对象:在操作 Excel 内的任何区域之前,都需要将其表示为一个 Range 对象,然后使用该 Rang ...

  8. 微信小程序把玩(三十二)Image API

    原文:微信小程序把玩(三十二)Image API 选择图片时可设置图片是否是原图,图片来源.这用的也挺常见的,比如个人中心中设置头像,可以与wx.upLoadFile()API使用 主要方法: wx. ...

  9. LINQ学习笔记(二)

    上一篇是根据百度百科写的随便,同时也纠正我对LINQ的看法,因为首次接触LINQ是使用EF对数据库数据的操作. 所以误以为它操作数据库的一种新手段. LINQ语言集成查询是一组技术的名称,这些技术建立 ...

  10. CopyMemory、FillMemory、MoveMemory、ZeroMemory

    CopyMemory 复制内存,第一个参数为目的地址,第二个参数为源地址,第三个参数为复制数据的大小,单位字节,源内存区域不能重叠,如果重叠,可以使用MoveMemory()函数.函数原型如下: vo ...