P3486 [POI2009]KON-Ticket Inspector
啊!这题做的真是爽!
除了DP这个方法是有提示的之外,这题居然没有题解,哈哈哈嘿嘿嘿。
很自豪的说:全是我自己独立解出来的一道题,包括设计状态,推倒(☺)转移方程,最后记录路径。
好了,首先,我们发现这题的输入贼别扭...然后我把每一行前面都加了点空格,大概就是这样:
0 2 1 8 2 1 0
0 3 5 1 0 1
0 3 1 2 2
0 3 5 6
0 3 2
0 1
0
(先做一个二维前缀和再说。sum[i][j]表示i,j右上角的和,注意不是左上角)
这样就很直观了。我们可以发现,如果在第i个站点检票,就能查到sum[i][i+1]个人。特别的,查一个区域两次是不会累加的。
设计状态:f[i][j][0],f[i][j][1]分别表示前i个站台查票j次时,能查到的最大人数 与 第j次查的站。
记录一个f[i][j][1]是因为状态转移方程要用。
然后我默默的拿出草稿纸推演方程,DP题手写比干想可靠多了。
想了一天的状态转移方程,结果在纸上不到10min就ok了。
f[i][j][0]=max(f[i-1][j][0] , f[j-1......i-1][j-1][0]+sum);
令p=j-1......i-1来循环找最大值
取前者时f[i][j][1]=f[i-1][j][1];
取后者时f[i][j][1]=i;
其中sum=sum[i][i+1]-sum[ f[p][j-1][1] ][i+1]; 看,这里就用到了f[p][j-1][1]。
然后就得出了我们的最大可查人数。
但是输出很坑,于是我写了个from[i][j]表示前i站查j次结果最大时,j-1次查的站。
然后每次记录一下from就行了。
代码如下,可以看到我的调试语句&我改动的痕迹。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[][],sum[][];
int f[][][];///0 sum 1 last
int from[][];
int main()
{
int n,k;
scanf ("%d%d",&n,&k);
for(int i=;i<n;i++)
{
for(int j=i+;j<=n;j++)///注意这里的j
{
scanf ("%d",&a[i][j]);
}
}
for(int i=;i<=n;i++)///前缀和
{
for(int j=n;j>=;j--)
{
sum[i][j]=sum[i-][j]+sum[i][j+]-sum[i-][j+]+a[i][j];
}
}
///
for(int i=;i<=n;i++) f[i][][]=sum[i][i+],f[i][][]=i;///初始化
///
for(int i=;i<=n;i++)///前i站
{
//printf("i=%d\n",i);
for(int j=;j<=i && j<=k;j++)///取j次的话
{
//printf("j=%d\n",j);
int large=-,largep;
for(int p=j-;p<i;p++)///是从p跳过来
{
//printf("p=%d\n",p);
///large=max(large,(f[p][j-1][0]+(sum[i][i+1]-sum[f[p][j-1][1]][i+1])));
if(large<(f[p][j-][]+(sum[i][i+]-sum[f[p][j-][]][i+])))///跳
{
large=(f[p][j-][]+(sum[i][i+]-sum[f[p][j-][]][i+]));
largep=p;
}
//printf("%d+(%d-%d)\n",f[p][j-1][0],sum[i][i+1],sum[f[p][j+1][1]][i+1]);
}
if(large>f[i-][j][]) f[i][j][]=large,f[i][j][]=i,from[i][j]=largep;
else f[i][j][]=f[i-][j][],f[i][j][]=f[i-][j][],from[i][j]=from[i-][j];
//printf("%d %d %d %d %d\n",i,j,f[i][j][0],f[i][j][1],large);
}
}
///DP完毕
///寻找路径
int d[],top=;
int p=f[n][k][];
for(int i=;i<=k;i++)
{
//printf("%d ",p);
d[++top]=p;
p=from[p][k-i+];
}
for(int i=top;i>=;i--) printf("%d ",d[i]);///输出
//printf("\n%d",f[n][k][0]);
return ;
}
/**
7 2
2 1 8 2 1 0
3 5 1 0 1
3 1 2 2
3 5 6
3 2
1
*/
蒟蒻代码
至此,这样一道(对于我这种蒟蒻来说)十分困难的题就AC啦!(没有优化,大家有兴趣可以自己试一下能不能优化)
P3486 [POI2009]KON-Ticket Inspector的更多相关文章
- 洛谷 P3486 [POI2009]KON-Ticket Inspector
P3486 [POI2009]KON-Ticket Inspector 题目描述 Byteasar works as a ticket inspector in a Byteotian Nationa ...
- [洛谷P3486]POI2009 KON-Ticket Inspector
问题描述 Byteasar works as a ticket inspector in a Byteotian National Railways (BNR) express train that ...
- bzoj 1133: [POI2009]Kon dp
1133: [POI2009]Kon Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 242 Solved: 81[Submit][Status][D ...
- bzoj1133: [POI2009]Kon
bzoj1133: [POI2009]Kon 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1133 思路 f[i][k]表示前i个,选了k个 ...
- 解题:POI 2009 Ticket Inspector
题面 看起来很水,然而不会DP的蒟蒻并不会做,PoPoqqq orz 设$f[i][j]$表示当前在第$i$个点和第$i+1$个点之间查票,已经查了$j$次的最大收益.然后就是那种很常见的枚举前一个结 ...
- [POI2009]Kon
Description 火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票.求一个查票方案,使得控制的不同的乘客尽量多. (显然对同一 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [POI2009]KON-Ticket Inspector(二维前缀和+DP)
题意 有n个车站,现在有一辆火车从1到n驶过,给出aij代表从i站上车j站下车的人的个数.列车行驶过程中你有K次检票机会,所有当前在车上的人会被检票,问最多能检多少个不同的人的票 (n<=600 ...
- POI2009 KON-Ticket Inspector
题目链接 Description 一辆火车依次经过 \(n\) 个车站,顺序是 \(1, 2, 3, ..., n - 1, n\).给定 \(A_{i, j}\) 表示从 \(i\) 站上车,\(j ...
随机推荐
- vue页面是否缓存的两种方式
第一种 <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> ...
- 缓存session,cookie,sessionStorage,localStorage的区别
https://www.cnblogs.com/cencenyue/p/7604651.html(copy) 浅谈session,cookie,sessionStorage,localStorage的 ...
- K3BOM跳层
A自制件,B自制件,C外购件 ,结构为A-B-C 如果需要跳层,则设置A-B跳层,B-C跳层,则生成A计划订单,C计划订单, 假设单独A-B跳层,则MRP运算出的结果也是A计划订单,B计划订单,C计划 ...
- Python __slots__ 作用
参考:https://blog.csdn.net/u010733398/article/details/52803643 https://blog.csdn.net/sxingming/artic ...
- InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
问题:打开mysql错误日志时发现大量的如下错误 Error: Table "mysql"."innodb_table_stats" not found. In ...
- python之对字符串类型的数组求平均值
该字符串是在网页表格中复制的,所以数字间由制表符间隔,先将其转换成列表,再进行统计计算.代码如下: str = "-18.1 -18.3 -18 -18.2 -18 -17.4 -18 -1 ...
- chrome中 GET /undefined 404
Chrome中调试网站,会出现 这是由 crxMouse Chrome™ 手势 引起的,关闭即可
- MySQL 优化小技巧
碎片整理: mysql数据一开始是在磁盘上顺序存放的,如果数据表有频繁的update改动,那么数据就会形成很多碎片,拖慢速度和不利于索引: 优化碎片有两种方式: alter table user en ...
- pip 指定版本
要用 pip 安装特定版本的 Python 包,只需通过 == 操作符 指定,例如: pip install -v pycrypto==2.3 将安装 pycrypto 2.3 版本.
- aop通配符语法
*.表示通配包名 *. == com. com.rl.ecps.service == *.*.*.*. ..表示 通配任何包及其子包 例如 com.. ==com. *.*.*. com.rl. ...