博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POI2007]堆积木Klo
阅读量:6271 次
发布时间:2019-06-22

本文共 1733 字,大约阅读时间需要 5 分钟。

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 530  Solved: 172
[][]

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

 

 题解:

摘自:

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

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

(无后效性和最优子结构都是可以保证的。统计答案的时候,每个f[]取一个mx)

其中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。

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]。

(我们现在只要满足两个条件:

a[i]>a[j]

i-a[i]>=j-a[j]

在排好序的新数列中,最后的LIS就是最后剩下的归位的积木。

首先这样的选法肯定是合法的。因为下标和数值,可以满足这两个条件

并且这样肯定是最优的,对于每一个位置,会求一个前i位LIS,是最长的一个,并且,LIS的方程,f[i]=max(f[j],a[j]<a[i],j<i)+1

就满足了原来的DP方程。相当于从所有的合法转移中,选择了一个最大的。

实际上,LIS里的f数组,和我们开始的DP中的f数组,是同一个数组。本质意义是一样的。

因为,转移的条件一样,转移的方程也一样。

所以,两个f一样。

 

所以,这个变形是等价的。

代码:

(网上借鉴)

#include 
#include
#include
#include
#define N 100100#define M 1000100using namespace std;struct node{ int x,y; friend bool operator < (node a,node b) { if(a.x==b.x)return a.y
>1; if(b[i].y>d[mid])ans=mid,l=mid+1; else r=mid-1; } ma=max(ma,ans+1); d[ans+1]=min(d[ans+1],b[i].y); } printf("%d\n",ma);}

 

转载于:https://www.cnblogs.com/Miracevin/p/9379800.html

你可能感兴趣的文章
sharepoint 2013 补丁升级步骤
查看>>
asp.net core 2.0 web api基于JWT自定义策略授权
查看>>
Skype for Business Server 2015-04-前端服务器-3-安装-管理工具
查看>>
第12章代码《跟老男孩学习Linux运维:Shell编程实战》
查看>>
我们为什么从Python转到go?
查看>>
5.Azure负载均衡(上)
查看>>
轻松精通awk数组企业问题案例
查看>>
26.Azure备份服务器(下)
查看>>
从“网上说的能信么”说开去---学习的思考
查看>>
DHCP 日志分析
查看>>
.NET Micro Framework动态调用C/C++底层代码(原理篇)
查看>>
Windows Server 2012正式版RDS系列⒃
查看>>
Shell脚本之awk篇
查看>>
微软发布Azure Stack硬件需求
查看>>
python socket编程详细介绍
查看>>
Windows Server 2016第三个技术预览版新技术
查看>>
Everything 本地磁盘文件搜索工具下载!
查看>>
Python dict(字典) 详细总结
查看>>
RPF(Reverse Path Forwarding 反向路径转发)技术
查看>>
2016年收到的第一件礼物,被评上微软全球最有价值专家MVP(一)
查看>>