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-最长下降子序列的更多相关文章

  1. 最长下降子序列O(n^2)及O(n*log(n))解法

    求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降 ...

  2. BUY LOW, BUY LOWER_最长下降子序列

    Description The advice to "buy low" is half the formula to success in the bovine stock mar ...

  3. 【最长下降子序列】【动态规划】【二分】XMU 1041 Sequence

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1041 题目大意: 一个二维平面,上面n(n<=1 000 000)个点.问至少选 ...

  4. 【最长下降子序列的长度和个数】 poj 1952

    转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size] ...

  5. POJ-1887 Testing the CATCHER(dp,最长下降子序列)

    Testing the CATCHER Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16515 Accepted: 6082 ...

  6. ZZNU 1719(最长上升子序列+最长下降子序列)

    先吐血一发,噗! 再吐血一次,啊啊啊啊! 好吧,做了那么多次最长上升子序列,看这题看了半天才发现还有最长下降子序列,呵呵哒! AC代码: #include<stdio.h>//老恶心#in ...

  7. HDOJ(1069)最长下降子序列

    每个箱子可有3种叠加方式,所以有3*n个箱子.将箱子按长度由大到小排序,有求箱子按宽度的最长下降子序列的高度之和即可. #include<cstdio> #include<algor ...

  8. 九度OJ 1112:拦截导弹 (DP、最长下降子序列)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3124 解决:1525 题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能 ...

  9. hdu1160简单dp最长下降子序列

    /* 简单dp,要记录顺序 解:先排序,然后是一个最长下降子序列 ,中间需记录顺序 dp[i]=Max(dp[i],dp[j]+1); */ #include<stdio.h> #incl ...

  10. POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14486   Accepted: 4695 Descri ...

随机推荐

  1. (转)HTML表格边框的设置小技巧

    对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 对于很多初学HTML的人来说,表格<table>是最常用的标签了 ...

  2. 替换 wcf 消息传输中的 命名空间

    替换 wcf 消息传输中的 命名空间,http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix

  3. 用java写bp神经网络(二)

    接上篇. Net和Propagation具备后,我们就可以训练了.训练师要做的事情就是,怎么把一大批样本分成小批训练,然后把小批的结果合并成完整的结果(批量/增量):什么时候调用学习师根据训练的结果进 ...

  4. UIView用户事件响应

    UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为 ...

  5. 【BZOJ2653】【主席树+二分】middle

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  6. 【BZOJ1483】【链表启发式合并】梦幻布丁

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...

  7. Android开发系列----学习伊始

    因为对移动端开发开始感兴趣,开始学习App开发,没有苹果环境的我,只好先选择Android来玩一玩了~~ 找了一套视频,买了几本java.android开发的书,开始搞起~~

  8. laravel5通过auth.attempt事件加入登陆验证码

    <?php namespace WangDong\Http\Controllers\Auth; use Illuminate\Http\Exception\HttpResponseExcepti ...

  9. 【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程

        (冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码.发现3个月前自己写的七大经典排序代码(C Language)突然运行出错. Makefile内容 ...

  10. Apache配置完虚拟主机后,使用Chrome访问localhost还是默认目录htdocs

    Chrome 解析DNS出错,这个错误比较罕见,甚至说有点奇特.今天在使用Apache配置虚拟主机时,出现了一个非常奇怪的现象.我按照配置的步骤配置虚拟主机,如下 配置虚拟主机的步骤如下: 1. 启用 ...