ZYF loves binary(dp)
【问题描述】
ZYF 无聊的时候喜欢研究二进制,她认为二进制的世界中只有三种运算:按 位与(and)、按位或(or)和异或(xor)。
有一天她找来了 n个小伙伴并给他们每人一个权值 ai, 然后她发现第 i个人 和第j 个人的友好程度可以表示为ai opt aj,其中 opt是三种运算的一种。 由于 ZYF忙着刷题所以想让你告诉她,对于从左到右的第2 到n 个人,他们 左边与他们友好程度的最大值是多少,还有达到最大值的人数是多少。
【输入格式】
第一行包含一个整数 n,一个串opt 和一个整数type,分别表示人数,运算 类型和数据类型。
第二行包含 n个整数,表示从左往右第 i个人的权值 ai。
【输出格式】
如果 type=0,输出 n-1 行,每行一个整数,其中第i 行输出和第i+1 个人友 好程度的最大值。
如果 type=1,输出 n-1 行,每行两个整数,其中第i 行输出和第i+1 个人友 好程度的最大值和达到最大值的人数。
【样例输入】
5 and 1
3 5 2 7 1
【样例输出】
1 1
2 1
5 1
1 3
【数据规模及约定】
对于 100%的数据,0<=ai<65536,n<=100000
题解:dp
因为ai<65536,所以读入的每一个数都是一个不超过16位的二进制数,所以我们考虑把数分成前八位和后八位。
f[i][j]表示已经出现过的前8位为i的数,与某个后8位为j的数做位运算,后8位的最大值,g[i][j] 表示最大值的方案数。
加入一个数x的时候,设前8位为x,后8位为y,枚举j,用所有j opt y更新所有f[x][j]。
查询一个数x的时候,枚举所有i,用(i opt a)<<8|f[i][b]更新答案
复杂度O(2^8*n)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1003
using namespace std;
int n,m,opt,g[N][N],f[N][N],a[1000000];
char s[N];
void And()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x&j)<<8|f[j][y];if (t>maxn) maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j&y);if (t>f[x][j]) f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
void Xor()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x^j)<<8|f[j][y];if (t>maxn) maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j^y);if (t>f[x][j]) f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
void Or()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x|j)<<8|f[j][y];if (t>maxn) maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j|y);if (t>f[x][j]) f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
int main()
{freopen("binary.in","r",stdin);freopen("binary.out","w",stdout);scanf("%d%s%d",&n,s,&opt);for (int i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,-1,sizeof(f));memset(g,0,sizeof(g));if (s[0]=='a') And();if (s[0]=='x') Xor();if (s[0]=='o') Or();return 0;
}
ZYF loves binary(dp)相关推荐
- DZY Loves Sequences (dp)
题目链接 题意: 给你一个数组,只能改变数组中一个数,找到最长严格递增子列,输出其区间长度. 思路: 1.dp,对于第i个数,用dp[i][0]保存左边严格递增区间长度(包括i),用dp[i][1]保 ...
- HDU 5230 ZCC loves hacking(DP)
Problem Description Now, a Codefires round is coming to end. ZCC has got C(0≤C≤106) points by solvin ...
- ZCC loves cube(cube)
ZCC loves cube(cube) 题目描述 调戏完了狗,ZCC开始玩起了积木.ZCC的面前有一块n*n的棋盘,他要用这些1*1*1的积木在棋盘上搭出一个宏伟的建筑.积木有三种颜色,ZCC认为一 ...
- LeetCode刷题记录4——67. Add Binary(easy)
LeetCode刷题记录4--67. Add Binary(easy) 目录 LeetCode刷题记录4--67. Add Binary(easy) 题目 语言 思路 后记 题目 今天这题是与字符串相 ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
最新文章
- html5 ar开发,HTML5 WebAR开发
- 2018年这些UI设计趋势正在流行,跟上必拿高薪!
- “ld: symbol(s) not found for architecture i386“错误解决方法
- SVN地址正确,能在网页打开,但是检出失败解决方法
- 三台主机分别部署LAMP
- Windows 95 诞生 25 周年
- 【Linux】40.date设定系统时间
- for-each 循环原理
- 获取图片中感兴趣区域的信息(Matlab实现)
- java 工厂模式 计算器_java设计模式之简单工厂模式
- TypeError: 'MongoClient' object is not callable
- 昆仑通态触摸屏数据转发上传_嵌_ModbusTcpIp数据转发 昆仑通态屏与屏之间通讯 - 下载 - 搜珍网...
- 操作系统之进程管理:12、生产者消费者问题和多级生产者多级消费者问题
- form怎么加ion_企业微信裂变该怎么做?一份裂变1000+社群裂变方案的底层逻辑
- java将所有的字符串转换为大写或小写
- 汇编中的inc和dec
- JAVA 实现《中国象棋》游戏
- java实现开根号:牛顿迭代法
- js截取视频第一帧_JS截取视频第一帧
- python变量四则运算_python_第一次作业 四则运算