【HDU-1051】Wooden Sticks 【线性DP】

  一堆n根木棍。每个棒的长度和重量是预先已知的。这些木棒将由木工机械一一加工。机器需要准备一些时间(称为准备时间)来准备处理木棍。设置时间与清洁操作以及更换机器中的工具和形状有关。木工机械
的准备时间如下:

  (a)第一个木棍的准备时间为1分钟。

  (b)在处理长度为l和重量为w的棒之后,如果l <= l‘并且w <= w‘,则机器将不需要设置长度为l‘和重量w‘棒的设置时间。否则,将需要1分钟进行设置。您将找到处理给定的n根木棍的最短准备时间。

 

  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
其实是很简单的一道线性dp,然鹅我手太笨半天调不过。

后一个木棍比前一个长且重,这不就是个不下降子序列??

那我们只要 l 进行排序, 求 w 的不下降子序列的最少划分数不就得了(反过来也彳亍)

根据dilworth定理(不知道的自己百度,我我也不会证),我们要做的就是求最长上升子序列。

数据不大, dp就可以氵过
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<iostream>
 5 const int maxn = 5005, inf = 0x3f3f3f3f;
 6 using namespace std;
 7 int f[maxn];
 8 struct node{
 9     int l, w;
10 }a[maxn];
11 bool cmp(node a, node b){
12     if(a.l == b.l) return a.w < b.w;
13     return a.l < b.l;
14 }
15 int main(){
16     int t; scanf("%d", &t);
17     while(t--){
18         int n; scanf("%d", &n);
19         for(int i=1; i<=n; i++) scanf("%d%d", &a[i].l, &a[i].w);
20         sort(a+1, a+1+n, cmp);
21         int maxx = 1;
22         for(int i=1; i<=n; i++){
23             f[i] = 1;
24             for(int j=1; j<i; j++){
25                 if(a[i].w<a[j].w && f[i]<f[j]+1){
26                     f[i] = f[j] + 1;
27                     maxx = max(maxx, f[i]);
28                 }
29             }
30         }
31         printf("%d\n", maxx);
32     }
33     return 0;
34 }

原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12652554.html

时间: 2024-11-05 13:40:34

【HDU-1051】Wooden Sticks 【线性DP】的相关文章

HDU 1051 Wooden Sticks 贪心||DP

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22000    Accepted Submission(s): 8851 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1051 Wooden Sticks (贪心)

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11249    Accepted Submission(s): 4629 Problem Description There is a pile of n wooden sticks. The length and weight of each stick a

HDU 1051 Wooden Sticks【贪心+排序】

/* 中文题目 木头 中文翻译-大意 加工第一个木头要调试机器,所以要一分钟,后面的木头在长度和重量上都要大于等于前一个木头,才不要调试机器,否则要调试机器,再花费一分钟 解题思路:先将木头的长度按升序排序,后面质量发生冲突的地方就要在之后重新安排一下 解题人:lingnichong 解题时间:2014-10-25 16:33:10 解题体会:一个括号的丢失,就导致错了一大片 */ Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    M

HDU 1051 Wooden Sticks 贪心题解

本题一看就知道是最长不减序列了,一想就以为是使用dp解决了.不过那是个错误的思路. 我就动了半天没动出来.然后看了看别人是可以使用dp的,不过那个比较难证明其正确性,而其速度也不快.故此并不是很好的解决方法. 所以我就直接硬算,硬模拟选择出非减子序列,选完就出答案了. 思路: 1 按照长度排序 2 按照不减原则选择重量,选一个,消灭一个. 最后消灭完了,就处理完毕,答案就自然出来了. 原来是一道披着dp的外套的模拟题啊!一道伪装成难题的简单题. 代码也可以写的非常简洁: #include <st

HDU 1051 - Wooden Sticks

贪心吧 保证一维非递减的情况下,计算另一维上最少有几个非递减序列,就是答案 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 int t,n; 6 struct P{ 7 int l,w; 8 }s[5005]; 9 bool cmp(P a,P b) 10 { 11 return a.l==b.l?a.w<b.w : a.l<b

贪心/hdu 1051 Wooden Sticks

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct node { int l,w; bool v; }; int n; node a[5010]; bool cmp(node x,node y) { if (x.l==y.l) return x.w<y.w; return x.l<y.l; } int main() { int T; scanf(

HDU 1051 Wooden Sticks【LIS】

题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头. 第一次做这一题目也没有做出来---而且也是好久以前---于是又看题解了--- 发现和将木材按两个关键字(先按重量由大到小排,如果重量相等的话则按长度由大到小排)排序后,和导弹拦截系统是一样的了,求长度的最长上升子序列. 自己写的二分查找一直输不出结果----555555 后来用了题解里面的lower_bound函数 搜了一点lower

【贪心专题】HDU 1051 Wooden Sticks (切割木棍)

链接:click here~~ 题目大意: 给n根木棍的长度和重量.根据要求求出制作木棍的最短时间.建立第一个木棍需要1分钟,若是接着要制作的木棍重量和长度都比此木棍长就不需要建立的时间,若是没有,则再需要建立时间.求时间最小为多少. [解题思路] 对木棍的长度和重量进行排序,以长度为首要考虑(也可以先考虑重量). 于是,我们对排序后的数组进行多次扫描,在一次建立时间内完成的进行标记,直到木棍全部标记(设置一个外部变量来计数已扫描的元素的数量) 举个别人的例子,加深理解 5 4 9  5 2 2

POJ 1065 Wooden Sticks Greed,DP

排序后贪心或根据第二关键字找最长下降子序列 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath>

HDOJ 1051. Wooden Sticks

HDOJ 1051. Wooden Sticks 题目 There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the ma