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 ...
随机推荐
- IIS下载地址
https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1038
- 动态SQL1
If标签 动态SQL可以说是MyBatis最强大之处了,这块的应用主要有四个方面if,choose,trim和foreach,接下来先说说if. 顾名思义,if是用来判断条件的,现在假设我们有个需求, ...
- Leetcode SingleNumber I & II & III 136/137/260
SingleNumber I: 题目链接:https://leetcode-cn.com/problems/single-number/ 题意: 给定一个非空整数数组,除了某个元素只出现一次以外,其余 ...
- java中级——集合框架【2】-二叉树
二叉树 二叉树概念 首先我们要明确,二叉树由各种节点组成:还有就是二叉树特点:(1)每个节点都可以有左子节点,右子节点(2)每一个节点都有一个值 如图所示: 代码所示: package cn.jse. ...
- hive子查询
如果集合中含有空值,不能使用not in的语法指令:但是可以使用in
- ubuntu18.04 安装 php7.2
sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository p ...
- 记一次ntp反射放大ddos攻击
2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)
转自: https://zhuanlan.zhihu.com/p/22252270 ycszen 另可参考: https://blog.csdn.net/llx1990rl/article/de ...
- codeforces472C
Design Tutorial: Make It Nondeterministic CodeForces - 472C A way to make a new task is to make it n ...
- ab与nc命令,tcpdump命令
ab与nc命令,tcpdump命令 ab -p post.txt -T application/json "http://127.0.0.1:8083/main/index&quo ...