博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1065 Wooden Sticks(zoj 1025) 最长单调子序列
阅读量:4647 次
发布时间:2019-06-09

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

POJ :

ZOJ: 

看大神的代码的研究的。。。

心情不好该学习还是要学习的。。。。QAQ

其实题目的意思就是把所有元素分为最少的堆数,每堆有l<=l' and w<=w' 按l排序后(l相等则按w),问题转化为把所有元素分为最少的堆数,每堆有w<=w'(l<=l' 显然成立) 即已知一个数列,要求最少用多少个不下降序列完全覆盖

可以证明不下降序列完全覆盖数就是最长下降子列的长度(记为L): 显然覆盖数不能比L小,否则由抽屉原理,必然有下降子列中两元素(a < b)在同一不下降须列中(a <= b),这是不可能的 由覆盖数可以取得L,而序列的每个元素在不同堆中,然后每次将元素“贪心”地分在堆中,这个过程和dp地求最长下降子列很像,可以构造解,也可以反证如果不能分号,与下降子列长度为L矛盾。

于是先将数列按照l,w的顺序进行快排,然后在求出w序列中的最长递减序列的长度就可以了.(摘自)

那么就转化为求最长递减序列的长度。

和LIS(最长上升字串差不多)

也可以二分来做。

#include
#include
#include
using namespace std;const int MAXN=5000+10;struct data{ int weight; int length;}a[MAXN];bool operator <(const data &a,const data &b){ if(a.length == b.length) return a.weight < b.weight; return a.length < b.length;}int main(){ int T; scanf("%d",&T); while(T--) { int dp[MAXN]; int n; scanf("%d",&n); for(int i=0;i
=0;j--) { if(a[i].weight < a[j].weight && dp[j]+1 > maxl) { maxl= dp[j]+1; } } dp[i]=maxl; } int ans=0; for(int i=0;i
ans) ans=dp[i]; printf("%d\n",ans); }}

转载于:https://www.cnblogs.com/murmured/p/5004240.html

你可能感兴趣的文章
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>
BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
查看>>
ubuntu 重启命令,ubuntu 重启网卡方法
查看>>