啊!这题做的真是爽!
除了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的更多相关文章

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

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

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

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

  3. bzoj 1133: [POI2009]Kon dp

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

  4. bzoj1133: [POI2009]Kon

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

  5. 解题:POI 2009 Ticket Inspector

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

  6. [POI2009]Kon

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

  7. bzoj AC倒序

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

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

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

  9. POI2009 KON-Ticket Inspector

    题目链接 Description 一辆火车依次经过 \(n\) 个车站,顺序是 \(1, 2, 3, ..., n - 1, n\).给定 \(A_{i, j}\) 表示从 \(i\) 站上车,\(j ...

随机推荐

  1. IIS下载地址

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1038

  2. 动态SQL1

    If标签 动态SQL可以说是MyBatis最强大之处了,这块的应用主要有四个方面if,choose,trim和foreach,接下来先说说if. 顾名思义,if是用来判断条件的,现在假设我们有个需求, ...

  3. Leetcode SingleNumber I & II & III 136/137/260

    SingleNumber I: 题目链接:https://leetcode-cn.com/problems/single-number/ 题意: 给定一个非空整数数组,除了某个元素只出现一次以外,其余 ...

  4. java中级——集合框架【2】-二叉树

    二叉树 二叉树概念 首先我们要明确,二叉树由各种节点组成:还有就是二叉树特点:(1)每个节点都可以有左子节点,右子节点(2)每一个节点都有一个值 如图所示: 代码所示: package cn.jse. ...

  5. hive子查询

    如果集合中含有空值,不能使用not in的语法指令:但是可以使用in

  6. ubuntu18.04 安装 php7.2

    sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository p ...

  7. 记一次ntp反射放大ddos攻击

    2018/3/26 ,共计310G左右的DDoS攻击 临时解决办法:将web服务转移到同生产一个内网段的备份服务器a上,a提供web端口80,数据库通过内网连接还是沿用生产数据库. 后续解决办法:通过 ...

  8. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)

    转自: https://zhuanlan.zhihu.com/p/22252270    ycszen 另可参考: https://blog.csdn.net/llx1990rl/article/de ...

  9. codeforces472C

    Design Tutorial: Make It Nondeterministic CodeForces - 472C A way to make a new task is to make it n ...

  10. ab与nc命令,tcpdump命令

    ab与nc命令,tcpdump命令 ab  -p post.txt  -T  application/json   "http://127.0.0.1:8083/main/index&quo ...