HDU-1051Wooden Sticks 线性DP

Posted hzoi-poozhai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1051Wooden 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
", maxx);
32     }
33     return 0;
34 }

 

以上是关于HDU-1051Wooden Sticks 线性DP的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1051 Wooden Sticks (贪心)

HDU 1051: Wooden Sticks(贪心)

Wooden Sticks(hdu1051)

HDU 1051 Wooden Sticks 贪心||DP

hdu 1051 Wooden Sticks

1051 Wooden Sticks(贪心-3)