CF1433F Zero Remainder Sum
写在前面
思维难度不是很大的 DP,代码实现也很容易。
状态设计模式很套路,转移也很好理解。
算法思路
(因为 \(k\) 是常用的循环变量,下文中将题面中的模数改为 \(p\))
虽然要求的是模 \(p\) 结果为 \(0\) 的答案,显然这个结果受到选择的数的和可能受到模 \(p\) 任何余数的影响。因此不妨设计状态的时候想到用一维来表示答案模 \(p\) 的余数。
加上这一维之后就是一个背包模板了。
设 \(f_{i, j, t, k}\) 表示在第 \(i\) 行前 \(j\) 个数中选出 \(t\) 个数,且模 \(p\) 余 \(k\) 的最大答案。
那么显然有:
\]
当可能存在多个(或多组) \(a_{i, j}\) 可能将同一个答案更新的时候,取最大值即可。
这样分别处理处每一行的答案之后,再设 \(g_{i, j}\) 表示在前 \(i\) 行中选择某些数使得其和模 \(p\) 的余数为 \(j\) 的最大答案。
那么显然有:
\]
Tips
注意一些边界条件。
处理的时候可能会出现不合法的状态,即在某一行内选出某些数,其和模 \(p\) 的余数根本不可能等于枚举的 \(k\) 的情况。这种处理方式归根到底还是因为它是从“选 \(0\) 个数的时候余数却不为 \(0\)”这个不合法状态转移来的。有个简单的处理方式,只需要将初值设为负无穷,然后将合法的初始状态(即选择数的个数和余数都为 \(0\))设为 \(0\) 就好了。
Code
代码中对于每一行分别处理了这一行的 \(f\) 数组,并紧接着更新 \(g\) 数组,因此将 \(f\) 数组删掉了一维。
代码中还使用了滚动数组。
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 75;
namespace Read {
inline int read() {
int fh = 1, res = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
return fh * res;
}
}
using namespace Read;
int n, m, p;
int a[Maxn][Maxn];
int f[2][Maxn][Maxn];
int g[2][Maxn];
int main() {
n = read(); m = read(); p = read();
for(register int i = 1; i <= n; ++i) {
for(register int j = 1; j <= m; ++j) {
a[i][j] = read();
}
}
memset(g, -0x3f, sizeof(g));
g[0][0] = 0;
for(register int i = 1; i <= n; ++i) {
memset(f, -0x3f, sizeof(f));
f[0][0][0] = 0;
for(register int j = 1; j <= m; ++j) {
f[j & 1][0][0] = 0;
for(register int t = 1; t <= min(j, m/2); ++t) {
for(register int k = 0; k < p; ++k) {
f[j & 1][t][k] = max(max(f[j & 1][t][k], f[j - 1 & 1][t][k]), f[j - 1 & 1][t - 1][(k - (a[i][j] % p) + p) % p] + a[i][j]);
}
}
}
for(register int j = 0; j < p; ++j) {
g[i & 1][j] = g[i - 1 & 1][j];
for(register int t = 0; t <= (m / 2); ++t) {
for(register int k = 0; k < p; ++k) {
g[i & 1][j] = max(g[i & 1][j], g[i - 1 & 1][(j - (f[m & 1][t][k] % p) + p) % p] + f[m & 1][t][k]);
}
}
}
}
printf("%d", g[n & 1][0]);
return 0;
}
CF1433F Zero Remainder Sum的更多相关文章
- C语言身份证信息查询系统(修改版)
很久以前写了一个<C语言身份证信息查询系统>,如果你点击链接进去看了. 估计也会被我那磅礴大气的代码震惊到的,最近复习/学习文件操作,把代码改了改,算是对以前还不会文件操作的时候的愿望,哈 ...
- leetcode刷题第二天<两数相加>
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode67.二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...
- jQuery使用工具集
//jq-util.js$.extend({ Util:{ /* 浏览器 */ browser:{ IE: !!document.all, IE6: !!document.all && ...
- 回归 | js实用代码片段的封装与总结(持续更新中...)
上一次更博还是去年10月28号了,截至今天已经有整整4个月没有更新博客了,没更新博客不是代表不学了,期间我已经用vue做了两个项目,微信小程序做了一个项目,只是毕竟找到工作了,想偷偷懒,你懂的. ...
- Codeforces Round #677 (Div. 3)
F. Zero Remainder Sum || dp #include <cstdio> #include <algorithm> #include <cstring& ...
- Weekly Contest 139
1071. Greatest Common Divisor of Strings For strings S and T, we say "T divides S" if and ...
- Codeforces - Educational Codeforces Round 5 - E. Sum of Remainder
题目链接:http://codeforces.com/contest/616/problem/E 题目大意:给定整数n,m(1≤n,m≤1013), 求(n mod 1 + n mod 2 + ... ...
- codeforces 85D D. Sum of Medians 线段树
D. Sum of Medians time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...
随机推荐
- AWS中国区使用https访问部署在S3上的网站
问题描述 最近一个项目需要通过https的方式访问部署在S3上的网站,通过搜索引擎找到一篇文章,可以在AWS Global实现整个过程.但是目前AWS中国区有限制,CloudFront不能使用AWS ...
- 深入浅出!阿里P7架构师带你分析ArrayList集合源码,建议是先收藏再看!
ArrayList简介 ArrayList 是 Java 集合框架中比较常用的数据结构了.ArrayList是可以动态增长和缩减的索引序列,内部封装了一个动态再分配的Object[]数组 这里我们可以 ...
- 简单的xml数据库设计
我的需求 有时候系统需要存储一些简单的关系型属性,不考虑并发,不考虑性能(一次操作在几ms),数据库没有其他依赖引用,拿过来就可以用 为什么选xml作为数据库? 可读性好 实体的对应关系不严格 , 二 ...
- CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)
1408E Avoid Rainbow Cycles 概述 非常有趣的题目(指解法,不难,但很难想) 非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就 ...
- Spring框架的IOC(控制反转)
1.1.IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制, ...
- 三、hadoop、yarn安装配置
本文hadoop的安装版本为hadoop-2.6.5 关闭防火墙 systemctl stop firewalld 一.安装JDK 1.下载java jdk1.8版本,放在/mnt/sata1目录下, ...
- C++语言基础——01一切的开始
环境准备 集成开发环境(Integrated Development Environment,IDE) 竞赛中最常见的是Dev-C++,平时练习采用其他IDE也可,使用方法都是类似的. 编译器 推荐使 ...
- SpringCloud Gateway快速入门
SpringCloud Gateway cloud笔记第一部分 cloud笔记第二部分Hystrix 文章目录 SpringCloud Gateway Zull的工作模式与Gateway的对比 Rou ...
- 你必须要懂的 Github 开源协议
作为一个开源社区的活跃者,那些开源协议你都懂什么意思吗? 列两个: Apache License 可以: 商用.修改.分发 但是要声明作者来源和你的修改以及协议 MIT License 只要声明版权 ...
- Python+Docker+Flask+pyecharts实现数据可视化
1.数据加工pyecharts图实现: 数据源:本地CSV文件 ps:由于是跟生产环境做交互,生产环境指标由HSQL加工,使用存储过程挂后台定时运行,后使用python实现导出及定时分发,本地pyth ...