zoukankan      html  css  js  c++  java
  • BZOJ1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 530  Solved: 172
    [Submit][Status]

    Description

    Mary在她的生日礼物中有一些积木。那些积木都是相同大小的立方体。每个积木上面都有一个数。Mary用他的所有积木垒了一个高塔。妈妈告诉Mary游戏的目的是建一个塔,使得最多的积木在正确的位置。一个上面写有数i的积木的正确位置是这个塔从下往上数第i个位置。Mary决定从现有的高塔中移走一些,使得有最多的积木在正确的位置。请你告诉Mary她应该移走哪些积木。

    Input

    输入文件的第一行为一个数n,表示高塔的初始高度。第二行包含n个数a1,a2,...,an,表示从下到上每个积木上面的数。(1<=n<=100000,1<=ai<=1000000)。

    Output

    注意:请输出最多有多少点可以处在正确位置

    Sample Input

    5
    1 1 2 5 4

    Sample Output

    3

    HINT

     

    Source

    题解:

    这题搁置了好几个星期。。。

    一开始我想到了直接LIS,以为就是正解,然后狂WA,看了seter的题解才知道我小看了poi的题目233333

    seter的题解:

    -------------------------------------------------------------------------------------------------

    先列下DP方程。令f[i]是第i个积木在自己的位置上时,前i个积木中最多能归位的数目。

    f[i]=max{f[j]|i>j,a[i]>a[j],a[i]-a[j]<=i-j}+1

    其中a[i]>a[j]是保证i,j都在自己的位置上,a[i]-a[j]<=i-j是为了保证中间有足够的积木让i能在a[i]这个位置上。

    为了让每个限制只和位置有关,a[i]-a[j]<=i-j可以变形为a[i]-i<=a[j]-j。

    这样一弄,好像就是一个LIS嘛!//我想到这儿,囧。。。。

    问题来了,这个东西有两个变量,难道要像LIS2那样乱搞?

    我们将下面两个式子加起来,

    1:a[i]-i<=a[j]-j ===> -a[i]+i>=-a[j]+j

    2:                                  a[i]>a[j]

    得到i>j……说明只要满足a[i]>a[j]和a[i]-i<=a[j]-j,则一定满足i>j!

    那么就只要按照a[i]-i排序(你想按照a[i]排序也行,那样两数相等就在求LIS的时候判了),求LIS即可。

    由于a[i]-i相等时,a[i]升序就可以使答案最大化,所以排序的时候第二关键字要弄成a[i]。

    -------------------------------------------------------------------------------------------------

    最后的神转化呀,我等蒟蒻只能orzzzzzzz

    代码:

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3983247.html
Copyright © 2011-2022 走看看