HihoCoder 1496:寻找最大值(思维DP)
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)的更多相关文章
- hihocoder 1496 寻找最大值(高维前缀最大次大值)
[题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠ ...
- hihocoder 1496 寻找最大值
题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai\&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行 ...
- Hihocoder 1496 寻找最大值(状态压缩 + 高位前缀和)
题目链接 Hiho 1496 设$f[i]$为二进制集合包含$i$的最大的两个数,这个东西用高维前缀和维护. 高位前缀和转移的具体方案 :枚举每一位,然后枚举每个集合,大的转移到小的. 注意合并的时 ...
- HihoCoder - 1496:寻找最大值(高维前缀和||手动求子集)
描述 给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 小Ho当然知道怎么 ...
- hihocoder offer收割编程练习赛12 D 寻找最大值
思路: 可能数据太水了,随便乱搞就过了. 实现: #include <iostream> #include <cstdio> #include <algorithm> ...
- 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 ...
- Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)
<题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...
- Queue CodeForces - 353D (思维dp)
https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...
- HihoCoder 1033交错和(数位DP第三题)
(写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...
随机推荐
- 二叉树C语言
几乎报价http://blog.csdn.net/hopeyouknow/article/details/6740616.为了这细微的地方进行了修改.他能够执行. bitree.h typedef i ...
- wcf 代理实例
通过过代理调用 wcf服务 using Microsoft.Extensions.Options; using System; using System.Collections.Generic; us ...
- WPF——TaskBarIconOverlay(任务栏图标叠加)
原文:WPF--TaskBarIconOverlay(任务栏图标叠加) <Window.Resources> <DrawingImage x:Key="OverlayIma ...
- SqlServer 使用脚本创建分发服务及事务复制的可更新订阅
原文:SqlServer 使用脚本创建分发服务及事务复制的可更新订阅 [创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]*********** ...
- 深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数
原文:深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数 概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来 ...
- JS function document.onclick(){}报错Syntax error on token "function", delete this token - CSDN博客
原文:JS function document.onclick(){}报错Syntax error on token "function", delete this token - ...
- extjs grid 复选框选择事件
开发中需求是统计选择的行数,所以要监控checkbox的选择事件包括表头的全选事件 遇到的问题就不赘述了 方案是监控grid的复选框和行加载时绑定事件 baseView: DBEN.controls. ...
- 在Windows IoT上使用网络摄像头
在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用.但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能. 关于摄像头的寻找和拍摄 ...
- [转] Protobuf高效结构化数据存储格式
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- 任何一件事,如果你不投入时间和精力去驯养,就不可能产生真正的兴趣和热爱(Focus Feedback FixIt的原理) good
这两本书和我们说的兴趣结合起来,为我们指明了精进的道路: 选择一个你感兴趣的方向 刻意练习 持续投入时间和精力 所谓刻意练习,简单说就是“3F”,即: Focus Feedback Fix it Fo ...