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)的代码
- ZOJ-1025-Wooden Sticks
- ZOJ 1025 Wooden sticks
- ZOJ 1025 Wooden Sticks
- zoj 1025 Wooden Sticks
- zoj 1025 wooden sticks
- ZOJ 1025 Wooden Sticks
- Zoj 1025 Wooden Sticks
- zoj 1025 Wooden Sticks
- zoj 1025 - Wooden Sticks
- zoj 1025 wooden sticks
- ZOJ - 1025 Wooden Sticks
- ZOJ 1025 Wooden Sticks
- ZOJ 1025:Wooden Sticks
- ZOJ 1025 Wooden Sticks【非DP做法】
- zoj 1025 Wooden Sticks 贪心 + 动态规划
- ZOJ Problem Set - 1025 Wooden Sticks
- zoj 1025 &&poj 1065 Wooden Sticks
- ZOJ 1025 Wooden Sticks
- Oracle Report開發(1)--Oracle Report Builder
- Expression Blend实例中文教程(10) - 缓冲动画快速入门Easing
- RSH远程Shell命令
- 颜色选择框
- IBM T30 开机困难问题的简单办法
- zoj 1025 Wooden Sticks
- VSS(2005)中如何强行签入文件
- Example of Makefile
- Backtrack 4: Crack WPA2
- 如何阅读linux内核源码
- zoj 1027 Human Gene Functions
- Web dynpro的SELECT-OPTIONS做成方法
- 构建form,保护隐私数据传递给本身,并且通过pre_init改变theme
- 内存管理-page初始化,分配与回收