• 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

    代码:

  • 相关阅读:
    3DES加密及.NET弱密钥处理
    SQL截取字符串分隔符中间部门的办法
    Aspose.Words给word文档加水印
    Servlet 学习
    .Net直接将Web页面table导出到Excel
    jquery查找frameset框架内iframe的元素
    前端js数据排序
    ASP.NET 在OnClientClick中js方法直接调用Eval绑定字段的数据
    SQL Server 查询中文字段返回为空
    软件开发中的命名规则
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3983247.html
Copyright © 2020-2023  润新知