Solution -「CF 1372E」Omkar and Last Floor
\(\mathcal{Description}\)
Link.
给定一个 \(n \times m\) 的矩阵,每行被划分为若干段,你可以钦定每段中恰好一个位置为 \(1\),其余位置为 \(0\)。设 \(c_i\) 为第 \(i\) 列 \(1\) 的个数,最大化 \(\sum_{i=1}^{m} c_i^2\)。
\(n,m\le100\)。
\(\mathcal{Solution}\)
区间 DP,不过状态设计比较巧妙:令 \(f(l,r)\) 表示确定在 \([l,r]\) 区间内的所有段的最大和。记 \(c_{l,r,k}\) 表示在区间 \([l,r]\) 内,包含了第 \(k\) 列的段的个数,转移:
\]
复杂度 \(\mathcal O(n^4)\)(求转移时在线求 \(c_{l,r,k}\))。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
const int MAXN = 100;
int n, m, f[MAXN + 5][MAXN + 5], L[MAXN + 5][MAXN + 5], R[MAXN + 5][MAXN + 5];
inline void chkmax ( int& a, const int b ) { a < b ? a = b : 0; }
int main () {
scanf ( "%d %d", &n, &m );
for ( int i = 1, k; i <= n; ++ i ) {
scanf ( "%d", &k );
for ( int j = 1, l = 1, r; j <= k; ++ j, l = r + 1 ) {
scanf ( "%*d %d", &r );
for ( int h = l; h <= r; ++ h ) L[h][i] = l, R[h][i] = r;
}
}
for ( int len = 1; len <= m; ++ len ) {
for ( int l = 1, r; ( r = l + len - 1 ) <= m; ++ l ) {
int& cur = f[l][r] = -1;
for ( int k = l; k <= r; ++ k ) {
int c = 0;
for ( int h = 1; h <= n; ++ h ) c += l <= L[k][h] && R[k][h] <= r;
chkmax ( cur, f[l][k - 1] + f[k + 1][r] + c * c );
}
}
}
printf ( "%d\n", f[1][m] );
return 0;
}
Solution -「CF 1372E」Omkar and Last Floor的更多相关文章
- Solution -「CF 1392G」Omkar and Pies
\(\mathcal{Description}\) Link. 给定两个长度为 \(K\) 的 \(01\) 串 \(S,T\) 和 \(n\) 组操作 \((a_i,b_i)\),意义为交换 ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
随机推荐
- java 关于 重写、覆写、覆盖、重载 的总结【不想再傻傻分不清了】
1.前言 有些东西,名称不同,其实就是一个东西,你说是扯淡不? 2.重写 重写,又叫覆写.覆盖 ,注解@Override,词义为推翻 , 用法特点是继承父类后,重写的父类方法名字.参数.返回值必须相同 ...
- 只需两步在Linux系统安装百度网盘--Ubuntu20
Linux Ubuntu系统安装百度网盘 百度网盘已支持Linux系统下载和使用.使用Linux系统下载并安装一个百度网盘是非常简单的,只需要以下两个步骤: 第一步 进入官网下载.deb类型的百度网盘 ...
- day3 创建数组并完成对数组的操作
1.实现函数action()初始化数据全0的操作 2.实现函数assignment()利用指针给数组赋值0~9 3.实现函数print()打印数组的每个函数 4.实现函数reverse()完成对数组的 ...
- 【经验总结】CodeBlocks使用mingw64
CodeBlocks使用 标签:c++ 一.安装并配置mingw-w64 使用中发现CB默认的编译器版本过低,c++11的一些东西无法使用,比如string中的stoi函数,因此尝试安装新版本的编译器 ...
- for in 遍历对象
如果直接写car.key会输出undefined,下面的注释是浏览器运行的原理,浏览器最终都是以car["key"]的方式来查找数据的
- Kubernetes的Resource和Dashboard(十三)
一.Resource和Dashboard 1.1.Resource 因为K8S的最小操作单元是Pod,所以这里主要讨论的是Pod的资源 官网:https://kubernetes.io/docs/co ...
- chapter3——逻辑回归手动+sklean版本
1 导入numpy包 import numpy as np 2 sigmoid函数 def sigmoid(x): return 1/(1+np.exp(-x)) demox = np.array([ ...
- 深入Windows APC
本篇原文为 Depths of Windows APC ,如果有良好的英文基础,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者 Rbmm ...
- 多源最短路-Floyd
题目描述 时间限制:5.0s 内存限制:256.0MB 问题描述 给定\(n\)个结点两两之间的单向边的长度,求两两之间的最短路径. 输入格式 输入第一行包含一个整数\(n\),表示点数. 接下来\( ...
- 【第十四期】高德go面经
自我介绍 选一个比较熟悉的项目讲讲 筛选日志的时候,日志格式是不一样的,你们是如何处理的? 处理日志的时候如果日志量比较大会堆积吗?怎么处理的? 日志落盘到机器上,是如何采集的? 采集服务有问题的话可 ...