啊!这题做的真是爽!
除了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. mybatis源码分析(二)------------配置文件的解析

    这篇文章中,我们将讲解配置文件中 properties,typeAliases,settings和environments这些节点的解析过程. 一 properties的解析 private void ...

  2. Spring是如何校验XML的

    首先来看下xml的一些概念: xml的schema里有namespace,可以给它起个别名.比如常见的spring的namespace: xmlns:mvc="http://www.spri ...

  3. Sublime Text3 配置 NodeJs 开发环境

    题外话:使用visual studio开发NodeJs也是很方便,只需要安装插件即可. 本着对Sublime Text3的喜爱,尤其是最近更新后,界面和功能上感觉更nice了,那就配置一发环境吧! ( ...

  4. Java8 flatMap的sample

    外国人写得, 很不错 http://www.java67.com/2016/03/how-to-use-flatmap-in-java-8-stream.html package test; impo ...

  5. QTP键盘操作笔记

    micCtrlDwn  Presses the Ctrl key. micCtrlUp  Releases the Ctrl key. micLCtrlDwn  Presses the left Ct ...

  6. Javassist之常用API的应用 02

    测试模型代码: package org.study2.JavaSenior.annotation.javassistDemo; /** * @Auther:GongXingRui * @Date:20 ...

  7. JAVA优先级队列元素输出顺序测试

    package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.Priority ...

  8. mybatis查询修改同时操作

    update dic_purchase set state =0 where purchase_number in (select tmp.* from (select purchase_number ...

  9. Spring03-AOP

    一. AOP介绍 1. Aop介绍 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编 ...

  10. 【XSY2785】模型

    题目描述 给你一棵\(n\)个点的树,让你加最少的边,使得图中没有割点. 要求输出方案. \(n\leq 500000\) 题解 把叶子的权值设为\(1\),其他点设为\(0\),找出带权重心. 以重 ...