codeforces 813 D. Two Melodies(dp)
题目链接:http://codeforces.com/contest/813/problem/D
题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么相差1或者相差7的倍数。
题解:应该会想到是dp,看数据量有可能是二维的不妨设dp[i][j],由于这里只需要求两组所以dp[i][j]要表示为一组以i为结尾,一组以j为结尾。那么如何更新dp?
i=j时dp[i][j]=0没什么好说的。这里可以选择一个基准遍历结尾小的,更新结尾大的。为什么要这么选?
假设x>y,如果更新dp[x][y]是从dp[x][i]来的话可能不能确保以x为结尾的最大值不经过i点。所以要更新dp[i][y]。大致思路是这样的具体看一下代码是怎么实现的。
#include <iostream>
#include <cstring>
using namespace std;
const int M = 5e3 + 10;
const int N = 1e5 + 10;
int a[M];
int maxmod[8];//a[i] mod 7 == j 时dp[i][y]的最大值
int maxnum[N];//a[i] == j 时dp[i][y]的最大值
int dp[M][M];
int main() {
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++) cin >> a[i];
memset(dp , 0 , sizeof(dp));
int ans = 0;
for(int i = 0 ; i <= n ; i++) {
memset(maxmod , 0 , sizeof(maxmod));
memset(maxnum , 0 , sizeof(maxnum));
for(int j = 1 ; j <= i ; j++) {
maxmod[a[j] % 7] = max(maxmod[a[j] % 7] , dp[i][j]);
maxnum[a[j]] = max(maxnum[a[j]] , dp[i][j]);
}
for(int j = i + 1 ; j <= n ; j++) {
dp[i][j] = max(dp[i][0] + 1 , dp[i][j]);
dp[i][j] = max(maxmod[a[j] % 7] + 1 , dp[i][j]);
dp[i][j] = max(maxnum[a[j] + 1] + 1 , dp[i][j]);
dp[i][j] = max(maxnum[a[j] - 1] + 1 , dp[i][j]);
maxmod[a[j] % 7] = max(maxmod[a[j] % 7] , dp[i][j]);
maxnum[a[j]] = max(maxnum[a[j] + 1] , dp[i][j]);
dp[j][i] = dp[i][j];
ans = max(ans , dp[i][j]);
}
}
cout << ans << endl; return 0;
}
codeforces 813 D. Two Melodies(dp)的更多相关文章
- CodeForces - 710E Generate a String (dp)
题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...
- Educational Codeforces Round 51 D. Bicolorings(dp)
https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...
- Codeforces 536D - Tavas in Kansas(dp)
Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...
- Codeforces 295D - Greg and Caves(dp)
题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...
- Codeforces 467C George and Job(DP)
题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...
- Codeforces A ACM (ACronym Maker) (dp)
http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...
- codeforces 762 D. Maximum path(dp)
题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是 ...
- CodeForces - 446A DZY Loves Sequences(dp)
题意:给定一个序列a,求最长的连续子序列b的长度,在至多修改b内一个数字(可修改为任何数字)的条件下,使得b严格递增. 分析: 1.因为至多修改一个数字,假设修改a[i], 2.若能使a[i] < ...
- Codeforces 559E - Gerald and Path(dp)
题面传送门 真·难度 *3000 的 D1E hb 跟我们说"做不出来不太应该". 首先我们将所有线段按 \(a_i\) 从小到大排序,一个很显然的想法是 \(dp_{i,j,d} ...
随机推荐
- 使用阿里云对docker拉取镜像加速
使用docker的时候,总是需要去search镜像,使用国外的源下载太慢,还有诸多的限制,无意中发现可以使用阿里云进行加速,实测有用,废话少说,操作如下: 1.打开阿里云控制台,没有的可以用淘宝账号或 ...
- 测试通过mweb进行发布Title
MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件,目前已支持 Mac,iPad 和 iPhone.MWeb 有以下特色: 软件本身: 使用原生的 macOS 技术打造,追求与系统的 ...
- 用python实现九九乘法表输出-两种方法
2019-08-05 思考过程:九九乘法表需要两层循环,暂且称之为内循环和外循环,因此需要写双层循环来实现. 循环有for和while两种方式. for循环的实现 for i in range(1,1 ...
- Node.js 环境搭建及简单应用
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型.如果你想创建自己的服务,那么Node.js是一个非 ...
- 非常实用的select下拉框-Select2.js
在Web开发中,Select下拉框是常用的输入组件.由于原生的Select几乎很难通过CSS样式控制.一些好看的Select下拉框就只能通过模拟来实现.PHP程序员雷雪松给大家推荐一筐款不错的Sele ...
- JavaMail的简单使用(自测可以发邮件)
在很多项目中我们都会遇到发送邮件的功能,发送邮件其实还是很实用的,正好今天做项目需要实现,现在来简单的整理一下发送邮件的实现. 建立邮件与服务器之间的会话 Properties props = new ...
- 以股票案例入门基于SVM的机器学习
SVM是Support Vector Machine的缩写,中文叫支持向量机,通过它可以对样本数据进行分类.以股票为例,SVM能根据若干特征样本数据,把待预测的目标结果划分成“涨”和”跌”两种,从而实 ...
- mysql row size上限
mysql innodb 的 row size上限 背景 在项目使用中,出现了以下报错: Error Code: 1118 - Row size too large (> 8126). Chan ...
- 身体质量指数BMI
Solution: 方法一:"Python语言程序设计"(中国大学MOOC平台)的答案 分析:对比两种指标,将共性(相同的区间)和异性(不同的区间)细分.这样两种指标的判断条件(不 ...
- Sqlmap过waf命令tamper各脚本的适用环境
0x00 相信很多小伙伴和我一样感同身受,站上明明有注入可是被万恶的WAF拦截了或者过滤了,这时候就需要用到SQLMAP强大的tamper了. 0x01 使用方法--tamper xxx.py apo ...