ZOJ1025-最长下降子序列
ZOJ1025-Wooden Sticks 加工木棒问题
【问题描述】
现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间用于清洗机器、调整工具和模板。
木工机需要的准备时间如下:
(1) 第一根木棒需要1min的准备时间;
(2) 在加工了一根长为l,重为w的木棒后,接着加工一根长为l’(l≤l’),
重为w’(w≤w’)的木棒是不需要任何准备时间的,否则需要1min的准备时间。
给定n根木棒,你要找到最少的准备时间。例如现在有长度和重量分别为(4,9)、(5,2)、(2,1)、(3,5)和(1,4)的5根木棒,那么所需准备时间最少为2min,顺序为(1,4)-》(3,5)-》(4,9)-》(2,1)-》(5,2)。
【输入】
输入有多组测试例。输入数据的第一行是测试例的个数T。
每个测试例两行:
第一行是一个整数n(1≤n≤5000),表示有多少根木棒;
第二行包括n×2个整数,表示l1,w1,l2,w2,l3,w3,…,ln,wn,全部不大于10000,其中li和wi表示第i根木棒的长度和重量。
数据由一个或多个空格分隔。
【输出】
输出是以分钟为单位的最少准备时间,一行对应一个测试例。
【输入样例】
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
【输出样例】
2
1
3
思路:
拿分析的样例来看,直接想到了离散上的偏序集,但只是想到了,不知道该怎么解。。。
看了下题解有了思路。先通过一轮cmp构造的排序,将问题进行转化——按照每个棒子的长度从小到大进行排序,然后得到基于棒子长度从小到大排序的棒子重量数组,将这个数组提取到w中保存,或者你不提出来也行,我就是为了方便,我称之为空间换简洁。
然后我们在把2维的偏序关系降到1维后(对,这个题就是降维打击:),就发现现在问题已经转换成了求w数组的最长上升子序列的最小个数,而这个问题,可以再次转换成求w数组的最长递减子序列的长度。后者的转换很容易理解,比如这个数组w的最长递减子序列的长度为5,那这5个值肯定各自在一个独立的最长上升子序列中。
两行大概就把问题的核心说清了,然后coding
#include <iostream>
#include <cstring>
#include <algorithm>
#define N 5007
using namespace std; int n,T;
struct stick{
int l,w;
} sticks[N];
int w[N];
int dp[N]; bool cmp(stick a,stick b)
{
if(a.l == b.l)
return a.w < b.w;
else if(a.l < b.l)
return true;
return false;
} int LIS(int* w)
{
int j;//j为当前最大结束点的坐标
dp[j=] = w[];
for(int i = ;i <= n;i++)
{
if(w[i] < dp[j])
dp[++j] = w[i];
else if(w[i] == dp[j]) continue;
else {
for(int k = j;k >= ;k--)
{
if(k == )
dp[] = w[i]>dp[]?w[i]:dp[];
//找到所有“合适”的位置
if(w[i]>dp[k] && w[i]<dp[k-])
dp[k] = w[i];
}
}
}
return j;
} int main()
{
cin>>T;
while(T--)
{
cin>>n;
int ans = ;
for(int i = ;i <= n;i++)
cin>>sticks[i].l>>sticks[i].w;
sort(sticks+,sticks++n,cmp);
for(int i = ;i <= n;i++)
w[i] = sticks[i].w;
cout<<LIS(w)<<endl;
}
return ;
}
ZOJ1025-最长下降子序列的更多相关文章
- 最长下降子序列O(n^2)及O(n*log(n))解法
求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降 ...
- BUY LOW, BUY LOWER_最长下降子序列
Description The advice to "buy low" is half the formula to success in the bovine stock mar ...
- 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1041 题目大意: 一个二维平面,上面n(n<=1 000 000)个点.问至少选 ...
- 【最长下降子序列的长度和个数】 poj 1952
转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...
- POJ-1887 Testing the CATCHER(dp,最长下降子序列)
Testing the CATCHER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16515 Accepted: 6082 ...
- ZZNU 1719(最长上升子序列+最长下降子序列)
先吐血一发,噗! 再吐血一次,啊啊啊啊! 好吧,做了那么多次最长上升子序列,看这题看了半天才发现还有最长下降子序列,呵呵哒! AC代码: #include<stdio.h>//老恶心#in ...
- HDOJ(1069)最长下降子序列
每个箱子可有3种叠加方式,所以有3*n个箱子.将箱子按长度由大到小排序,有求箱子按宽度的最长下降子序列的高度之和即可. #include<cstdio> #include<algor ...
- 九度OJ 1112:拦截导弹 (DP、最长下降子序列)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3124 解决:1525 题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能 ...
- hdu1160简单dp最长下降子序列
/* 简单dp,要记录顺序 解:先排序,然后是一个最长下降子序列 ,中间需记录顺序 dp[i]=Max(dp[i],dp[j]+1); */ #include<stdio.h> #incl ...
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14486 Accepted: 4695 Descri ...
随机推荐
- 系统重装c盘后,mysql重新设置
之前我的mysql装在d盘,重装了系统后,虽然只格式化了c盘,但mysql还是不能用了.我网上找了找.修改了一下配置. 1.首先设置环境变量,编辑path,在后面添加上mysql的安装路径 : 2.之 ...
- iOS 小知识 - #if , #ifdef , #ifndef.
Q : 在项目的 .h 文件中, #ifndef XXX_h #define XXX_h //程序段1 #endif /* XXX_h */ 的作用? A : 如果 XXX.h 不存在,就引入 XX ...
- Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)
本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之 ...
- Vijos1825 NOI2008 志愿者招募 费用流
Orz ByVoid大神的题解:https://www.byvoid.com/blog/noi-2008-employee/ 学习网络流建图的好题,不难想到线性规划的模型,不过利用模型的特殊性,结合网 ...
- zoj 3209.Treasure Map(DLX精确覆盖)
直接精确覆盖 开始逐行添加超时了,换成了单点添加 #include <iostream> #include <cstring> #include <cstdio> ...
- Visual Studio 2013环境下操作vc6/vc7/vc8等低版本平台项目【编译|生成|调试】
现代化的开发环境,微软一直在推出更新换代,我们所处的技术环境在日新月异的变化:不过在中国多数人们一边疲惫的追赶着时代的步伐,一边坚守着自己所获悉所掌握的那些紧吧吧的知本.对技术工具的掌握并非他们所想要 ...
- javascript——迭代方法
<script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...
- cos-26上传个人案例
package cn.gdpe.upload; import java.io.File;import java.io.IOException;import java.util.Enumeration; ...
- Bootstrap_表单_表单控件状态
一.焦点状态 焦点状态是通过伪类“:focus”来实现.Bootstrap框架中表单控件的焦点状态删除了outline的默认样式,重新添加阴影效果. <form role="form& ...
- Canvas实现文字粒子化,并且绕轴旋转(完善)
1. 之前有放过一个初始版本,但是因为在旋转的时候,有比较大的瑕疵,造成每个点运动到端点后,出现类似撞击的感觉. 2. 所以本文对旋转作了些调整,运用类似水平方向的圆周运动 a. HTML代码,定义c ...