zoj 1025 Wooden Sticks

来源:互联网 发布:网络传播与策划 刘芸 编辑:程序博客网 时间:2024/04/27 03:29

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25 


 引用cc98 watashi 大牛的话: 
其实题目的意思就是把所有元素分为最少的堆数,每堆有l<=l' and w<=w' 按l排序后(l相等则按w),问题转化为把所有元素分为最少的堆数,每堆有w<=w'(l<=l' 显然成立) 即已知一个数列,要求最少用多少个不下降序列完全覆盖
可以证明不下降序列完全覆盖数就是最长下降子列的长度(记为L): 显然覆盖数不能比L小,否则由抽屉原理,必然有下降子列中两元素(a < b)在同一不下降须列中(a <= b),这是不可能的 由覆盖数可以取得L,而序列的每个元素在不同堆中,然后每次将元素“贪心”地分在堆中,这个过程和dp地求最长下降子列很像,可以构造解,也可以反证如果不能分号,与下降子列长度为L矛盾。
于是先将数列按照l,w的顺序进行快排,然后在求出w序列中的最长递减序列的长度就可以了.
最长单调子序列及其计数问题

方法一:
设数列长度是n+1,那么很显然最长子序列可以这么来解决:假设已求出a[0]到a[n-1]的最长子序列的长度为s,如果a[n]小于这个子序列的最后一个元素,那么数列a的最长递减序列长度就是s+1。所以类似的对于每个元素都可以这么来求。设数组b,其中b[i]表示从a[0]到a[i]且终止于a[i]的最长递减序列的长度。则有:
b[i] = MAX { b[t] + 1 | a[t] > a[i], 0 <= t < i },如果存在t的话;否则b[i] = 1。
这样,对输入数列从前到后地扫描一遍,将数组b填满,然后b[i]的最大值就是最长递减序列的长度。
算法很容易实现,时间复杂度为O(n^2)。

我写的代码:
 

方法二:

  

 

最后,贴上我AC的O(n2)的代码

 

原创粉丝点击