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 ...
随机推荐
- equals函数的作用
1.equals函数在什么地方 在Object类中,写法与==一样,但是我们用的时候要重写这个equals方法 String类型中的equals是复写好的 2.equals函数的作用 ==号在比较两个 ...
- 【转】iOS-Core-Animation-Advanced-Techniques(四)
原文:http://www.cocoachina.com/ios/20150105/10812.html 隐式动画和显式动画 隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第 ...
- 内容替换Filter
有时候需要对网站进行控制,防止输出非法内容或者敏感信息.这时我们可以使用filter来进行内容替换,其工作原理为,在Servlet将内容输出到response时,response将内容缓存起来,在Fi ...
- python3实现邮件发送程序
刚开始的想法很简单,由于有上千封的邮件需要发出去,并且需要一条一条发送,不能转发或群发,每条邮件要署对方的姓名,并加上几个相同的符件,考虑到手工操作繁琐无趣,所以想到用程序实现,python好像非常胜 ...
- 从windows到Linux-ubuntu新手
版本选择: 经多次实验,Ubuntu个人认为长期支持(LTS)版才值得装. VMware9中测试:Ubuntu10.04开机内存170M,Ubuntu12.04开机内存340M. 个人感觉Ubuntu ...
- 汇总前端最最常用的JS代码片段
html5选择器 //参数均接收一个合法的css选择器 element = document.querySelector('.foo,.bar');//返回带有foo或者bar样式类的首个元素 ele ...
- cocod2d-x 之 HelloWorld
cocos2d-x 2.2创建项目 进入cocos2d-x-2.2/tools/project-creator,运行命令 python create_project.py -project MyGam ...
- ajax验证用户名和找回密码参考
// JavaScript Document function chkname(form){ var user = form.user.value; if(user == ''){ alert('请输 ...
- js以json形式提交数据,后台接受
$("#savename").click(function(){ var fananname=$("#editname").val(); var jsonLis ...
- Python 环境
文章出处:http://www.cnblogs.com/winstic/,请保留此连接 总结一下自己使用python过程中安装三方包的方法 Python 安装 Python的安装非常简单,本人使用的w ...