1234. 倍数问题 dp 数组 背包问题 状态压缩
众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。
但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。
现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。
数据保证一定有解。
输入格式
第一行包括 2 个正整数 n, K。
第二行 n 个正整数,代表给定的 n 个数。
输出格式
输出一行一个整数代表所求的和。
数据范围
1≤n≤105,
1≤K≤103,
给定的 n 个数均不超过 108
输入样例:
4 3
1 2 3 4
输出样例:
9
将题目要求的K用m来表示:首先普通的dp:
f[i][j][k]表示:前i个数中选取j个数的和对m的余数为k的最大值.
但是空间不允许优化(状态压缩):
由于每种对m的余数我们只需要取前三个最大的数就可,因此可以压缩第一个维度,变成二维因此首先对每个数求余数,然后记录下来,后面对于每种余数只取前三个数进行递推。
import java.util.*;public class Main
{static int N=1005,m,INF=0x3f3f3f3f;static Vector<Integer> a[]=new Vector [N];static int f[][]=new int [4][N];static int b[]=new int [N];static int mathmod(int x){return (x%m+Math.abs(m))%m;}public static void main(String args[]){Scanner sc=new Scanner(System.in);int n=sc.nextInt();m=sc.nextInt();for(int i=0;i<m;++i)a[i]=new Vector<>();//还有注意这里的初始化,因为默认的0并不能作为普遍的初始值,否则在状态计算的时候会导致问题,因此需要将初始值设置为-INF.for(int i=0;i<4;++i)Arrays.fill(f[i], -INF);for(int i=0;i<n;++i){int x=sc.nextInt();int t=x%m;a[t].add(x);}f[0][0]=0;for(int i=0;i<m;++i){Collections.sort(a[i],Collections.reverseOrder());for(int u=0;u<3&&u<a[i].size();u++){int x=a[i].get(u);for(int j=3;j>=1;--j){//注意这里j只能从大到小,因为省略了第一维,但是实际上是从上一层来的,j从大到小才能保证来自上一层。for(int k=0;k<m;++k){f[j][k]=Math.max(f[j][k], f[j-1][mathmod(k-x)]+x);}}}}System.out.println(f[3][0]);}
}
1234. 倍数问题 dp 数组 背包问题 状态压缩相关推荐
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- HDU 4352 数位dp + LIS(nlogn) + 状态压缩
#define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entir ...
- 状态压缩dp学习小记part2
继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...
- 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索
[AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...
- Light OJ 1316 A Wedding Party 最短路+状态压缩DP
题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...
- 由NP完全问题引出动态规划——状态压缩DP
" 所有部分都应当在非强制的情况下组合回一起.要记住,你重组的那部分原来就是你拆解的.因此,如果你不能让它们组合回来的话,那一定是有原因的.要想尽一切办法,除了用锤头." – IB ...
- 状态压缩动态规划 - 总结【普及+,提高-】
状态压缩动态规划是一类特殊的动态规划,通常有一维用来表示一个二进制状态.状态压缩,顾名思义,就是把原来要一个bool数组表示状态压缩到一个int变量里.围绕状压DP,我们将介绍它的前世今生,领略状压D ...
- 状态压缩:对动态规划进行降维打击
文章目录 我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O(N^2),堪称算法界的二向箔,把各路魑魅魍魉统统打成二 ...
- 状态压缩技巧:动态规划的降维打击
刷题认准labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? 我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时 ...
最新文章
- Java http协议概述
- hdu1394线段树点修改,区间求和
- 笔记-信息系统安全管理-网络安全防御
- div置于页面底部_网易内部PPT模板有点丑,如何花最少的时间提高页面颜值?
- 贝叶斯规则(Bayes’ rule)
- postman cookie设置_是时候抛弃Postman了,因为REST Client更香
- 刷程序对车危害_刷ecu对车有影响吗?会伤车吗?
- 单片机控制三相异步电动机正反转c语言程序,用FX PLC控制三相异步电动机的启动与正反转...
- 数据结构考研复试、面试 ——常见提问总结
- 强烈推荐10本程序员必读的书
- Unity 之 贝塞尔曲线介绍和实际使用
- 用Photoshop抠图
- 忘记ISO-8859-1
- STM32F103C8T6在Arduino框架下驱动SH1106 1.3“ IIC OLED显示
- VUE进阶篇Part9(render函数)
- 求解n个二进制数之间的最小码距
- Phunware在全球发行Phun实用型代币
- win7摄像头软件_5款用起来超爽的Windows高效软件
- Python:Excel自动录入、Excel表格快速合并(附有源代码)
- 1. 数据可视化简介 笔记