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的地图插件amap
https://www.jianshu.com/p/0011996b81e2(amap) npm install vue-amap --save
- java日志框架之logback(一)——logback工程简介
Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...
- 老男孩python学习自修第四天【字典的使用】
dict = {key1:value1, key2:value2} 定义字典 dict[key] = value 设置字典中指定健的值 dict.pop(key) 删除字典中指定健 dict.popi ...
- maven(win10)配置完环境变量后无法识别mvn -v命令
第一步:http://maven.apache.org/download.cgi官网下载 第二步:把压缩包解压缩到不含中文和空格的目录下 第三步:新建MAVEN_HOME环境变量,值为maven解压缩 ...
- 获取网络图片并显示在picturbox上,byte[]数组转换成Image:
private void getWebPicture_Click(object sender, EventArgs e) { WebRequest request = WebRequest.Creat ...
- Linux 下 解压zip文件出现乱码
网上下载了一个文件,鼠标右键提取出来发现中文文件名全部乱码: 打开命令行 unzip -h 可以看到 -O 参数 制定编码解压: 比如: unzip -O CP936 xxx.zip
- cefSharp 开发随笔
最近用cefSharp开发一点简单的东西.记录一点随笔,不定时更新. 1.用nuget安装完之后,架构要选择x86或者x64,否则编译会报错(截止到Chrome 55版本) 2.向Chrome注册C# ...
- linux读取Windows的txt文件问题
问题:Windows下生成的txt文件,在Linux下读取时会读取到多余字符(如: ^M) 原因:Windows和Linux下的换行符不一致 解决:在Linux代码中将多余字符去掉 ) buf = b ...
- Javascript和Jquery语法对比总结
目的 相信大家都知道jq是js的一个类库,是为了方便我们开发前端,但是笔者在刚开始学习js和jq时经常将两者的语法记混和混用,所以整理下两者实现相同功能之前的语法区别. 声明变量 javascript ...
- Ubuntu18.04下安装Sublime Text3!
这几天安装了Ubuntu18.04,然后在里面安装Sublime Text3,结果各种问题!各种BUG!试了网上各种办法!尼玛!都是坑爹的啊! 最后还是楼主自己解决了…… 废话不多说,直接按顺序执行下 ...