众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。

但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。

现在小葱给了你 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 数组 背包问题 状态压缩相关推荐

  1. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  2. HDU 4352 数位dp + LIS(nlogn) + 状态压缩

    #define xhxj (Xin Hang senior sister(学姐))  If you do not know xhxj, then carefully reading the entir ...

  3. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  4. 【AcWing】数位统计DP、树形DP、状态压缩DP、记忆化搜索

    [AcWing]数位统计DP.树形DP.状态压缩DP.记忆化搜索 一.数位统计DP 二.状态压缩DP 三.树形DP 四.记忆化搜索 一.数位统计DP 计数问题 给定两个整数 a 和 b,求 a 和 b ...

  5. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  6. 由NP完全问题引出动态规划——状态压缩DP

    " 所有部分都应当在非强制的情况下组合回一起.要记住,你重组的那部分原来就是你拆解的.因此,如果你不能让它们组合回来的话,那一定是有原因的.要想尽一切办法,除了用锤头." – IB ...

  7. 状态压缩动态规划 - 总结【普及+,提高-】

    状态压缩动态规划是一类特殊的动态规划,通常有一维用来表示一个二进制状态.状态压缩,顾名思义,就是把原来要一个bool数组表示状态压缩到一个int变量里.围绕状压DP,我们将介绍它的前世今生,领略状压D ...

  8. 状态压缩:对动态规划进行降维打击

    文章目录 我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O(N^2),堪称算法界的二向箔,把各路魑魅魍魉统统打成二 ...

  9. 状态压缩技巧:动态规划的降维打击

    刷题认准labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? 我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时 ...

最新文章

  1. Java http协议概述
  2. hdu1394线段树点修改,区间求和
  3. 笔记-信息系统安全管理-网络安全防御
  4. div置于页面底部_网易内部PPT模板有点丑,如何花最少的时间提高页面颜值?
  5. 贝叶斯规则(Bayes’ rule)
  6. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  7. 刷程序对车危害_刷ecu对车有影响吗?会伤车吗?
  8. 单片机控制三相异步电动机正反转c语言程序,用FX PLC控制三相异步电动机的启动与正反转...
  9. 数据结构考研复试、面试 ——常见提问总结
  10. 强烈推荐10本程序员必读的书
  11. Unity 之 贝塞尔曲线介绍和实际使用
  12. 用Photoshop抠图
  13. 忘记ISO-8859-1
  14. STM32F103C8T6在Arduino框架下驱动SH1106 1.3“ IIC OLED显示
  15. VUE进阶篇Part9(render函数)
  16. 求解n个二进制数之间的最小码距
  17. Phunware在全球发行Phun实用型代币
  18. win7摄像头软件_5款用起来超爽的Windows高效软件
  19. Python:Excel自动录入、Excel表格快速合并(附有源代码)
  20. 1. 数据可视化简介 笔记

热门文章

  1. css3动画工具_您应该收藏的10个CSS3动画工具
  2. qq业务免密查询API接口
  3. 天猫数据分析软件(天猫销售数据如何查询)
  4. 在C 用GDI+实现图形图像的任意变形效果
  5. 今日语录190414
  6. 小米fortnite_如何将Fortnite移到另一个文件夹,驱动器或PC
  7. 服装店客流统计应该怎么做才能在今天生存下去?
  8. java ee tag标签文件_12.《JavaEE 学习笔记》自定义标签库
  9. 关于一个用VB编写的PING工具的问题
  10. 组策略8-显示桌面图标策略