题目链接

Description

一辆火车依次经过 \(n\) 个车站,顺序是 \(1, 2, 3, ..., n - 1, n\)。给定 \(A_{i, j}\) 表示从 \(i\) 站上车,\(j\) 站下车的个数。

有 \(K\) 次在每站操作后的检票机会,问最多能检票的多少不同的人。

Solution

这相当于给你 \(\dfrac{n^2}{2}\) 条线段(对于 \(A_{i, j}\) 而言对应的线段是 \([i, j - 1]\),因为选的点是在那站后,下车的就没了),每个线段有个权值,让你选择 \(K\) 个点,使得 \(K\) 个点所涉及的线段(重复的算一次)的权值和最大。

考虑 DP,用代表元计数法,考虑把每个线段的贡献记录在他那条线段上有的第一个点上。

状态设计

设 \(f_{i, j}\) 为前 \(i\) 个车站,已经检票了 \(j\) 次,并且在第 \(i\) 个车站后检票的最多人数

初始状态

\(f_{0, 0} = 0\),其余为负无穷(其实这里赋值与否没啥关系)。

状态转移

\(f_{i, j} = \max\{f_{k, j - 1} + val(k + 1, i)\}\)

其中 \(val(l, r)\) 表示在线段左端点在 \([l, r]\) 且右端点 $ \ge r$ 的线段个数,这个东西可以 \(O(N^3)\) 暴力预处理。

答案

\(ans = \max\{f[i][K]\}\)

时间复杂度

\(O(N^2K)\)

Tips

  • 大坑,可能造成贡献的点 $ < K$,这时候你就需要从剩下的站点中,选择一些字典序较小的来输出。

Code

#include <iostream>
#include <cstdio> using namespace std; const int N = 605, S = 55; int n, tot, K, a[N][N], pre[N][S], val[N][N], cnt[N], f[N][S]; bool vis[N]; void print(int i, int j) {
if (j == 0 || i == 0) return ;
print(pre[i][j], j - 1);
vis[i] = true;
++tot;
} int main() {
scanf("%d%d", &n, &K);
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) scanf("%d", &a[i][j]);
} for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) cnt[j] = 0;
for (int j = i; j <= n; j++) {
for (int k = j + 1; k <= n; k++) cnt[k - 1] += a[j][k];
for (int k = n; k >= j; k--) val[i][j] += cnt[k];
}
} for (int i = 1; i <= n; i++) {
for (int j = 1; j <= K; j++) {
for (int k = 0; k < i; k++) {
if (f[k][j - 1] + val[k + 1][i] > f[i][j]) {
f[i][j] = f[k][j - 1] + val[k + 1][i];
pre[i][j] = k;
}
} }
} int ans = 0, p;
for (int i = 1; i <= n; i++) if (f[i][K] > ans) ans = f[i][K], p = i;
print(p, K);
for (int i = 1; i <= n; i++) {
if (vis[i]) printf("%d ", i);
else if (tot < K) tot++, printf("%d ", i);
}
return 0;
}

POI2009 KON-Ticket Inspector的更多相关文章

  1. bzoj 1133: [POI2009]Kon dp

    1133: [POI2009]Kon Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 242  Solved: 81[Submit][Status][D ...

  2. bzoj1133: [POI2009]Kon

    bzoj1133: [POI2009]Kon 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1133 思路 f[i][k]表示前i个,选了k个 ...

  3. 解题:POI 2009 Ticket Inspector

    题面 看起来很水,然而不会DP的蒟蒻并不会做,PoPoqqq orz 设$f[i][j]$表示当前在第$i$个点和第$i+1$个点之间查票,已经查了$j$次的最大收益.然后就是那种很常见的枚举前一个结 ...

  4. [POI2009]Kon

    Description 火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票.求一个查票方案,使得控制的不同的乘客尽量多. (显然对同一 ...

  5. 洛谷 P3486 [POI2009]KON-Ticket Inspector

    P3486 [POI2009]KON-Ticket Inspector 题目描述 Byteasar works as a ticket inspector in a Byteotian Nationa ...

  6. [洛谷P3486]POI2009 KON-Ticket Inspector

    问题描述 Byteasar works as a ticket inspector in a Byteotian National Railways (BNR) express train that ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. P3486 [POI2009]KON-Ticket Inspector

    啊!这题做的真是爽!除了DP这个方法是有提示的之外,这题居然没有题解,哈哈哈嘿嘿嘿.很自豪的说:全是我自己独立解出来的一道题,包括设计状态,推倒(☺)转移方程,最后记录路径. 好了,首先,我们发现这题 ...

  9. [POI2009]KON-Ticket Inspector(二维前缀和+DP)

    题意 有n个车站,现在有一辆火车从1到n驶过,给出aij代表从i站上车j站下车的人的个数.列车行驶过程中你有K次检票机会,所有当前在车上的人会被检票,问最多能检多少个不同的人的票 (n<=600 ...

随机推荐

  1. 如何避免Cephfs被完全毁掉

    前提 一套系统的最低要求是可恢复,也就是数据不丢失,但是在各种各样的原因下,整套系统都有被毁掉的可能,一直以来有个观点就是存储是需要两套的,一般情况下很难实现,但是如何把故障发生的概率降低到最低,这个 ...

  2. js-根据日期获取本年所有周日

    /** * 方法 描述 Date() 返回当日的日期和时间. getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31). getDay() 从 Date 对象返回一周中的某一天 ( ...

  3. 直面秋招!非科班生背水一战,最终拿下阿里等大厂offer!

    前言 2020年已经接近到9月份了,很多粉丝朋友都对金九银十雀雀欲试了吧!也有很多朋友向我求教经验,因为我自己工作相对于稳定,在这里给大家分享一个粉丝朋友的经历,他作为一个曾经的菜鸡面试者,在不断的失 ...

  4. 他是 ISIJ 第四名,也是在线知名题库的洛谷“网红”

    转载自加藤惠. 2020年国际初中生信息学竞赛(ISIJ)上,以优秀成绩拿下第四名年仅初三的张湫阳,成为最夺目的选手之一. 而且虽然是初三的选手,但他取得优异成绩后,不少网友并不感到陌生,纷纷留言: ...

  5. JavaSE 学习笔记02丨对象与类

    Chapter 4. 对象与类 4.1 面向对象程序设计概述 面向对象程序设计(简称OOP),是当今主流程序设计范型.面向对象的程序是由对象组成的,每个对象(来自于标准库或自定义的)包含对用户公开的特 ...

  6. Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree 题解(贪心+易错)

    题目链接 题目大意 给你一课树,要你给每一条边分权值,每条边的权值大于0,他们的乘积等于k,而且要使得n-1条边1的数量尽可能少,定义 f(u,v)为u到v的边权和求 \(\max \sum_{i=1 ...

  7. GraphicsLab 之 Atmospheric Scattering (一)

    作者:i_dovelemon 日期:2020-10-11 主题:Atmospheric Scattering, Volume Scattering, Rayleigh Scattering, Mie ...

  8. 给你的C/C++学习路线建议

    因为程序员的高工资,吸引了大部人学习编程,但是通过书籍和视频来学习,总是别人推荐一点是一点,那么如何才能系统有效的学习呢?今天就为你来介绍~ C语言是所有学习编程的人都应该首要学习的语言,今天就C语言 ...

  9. java数组作为函数返回值

    1 //将一个二维数组行和列元素互换.存到另一个二维数组 2 package test; 3 4 public class test1_8 { 5 public static int[][] huhu ...

  10. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...