挑战练习题2.3动态规划 poj1065 Wooden Sticks 最长递减子序列

    xiaoxiao2021-03-25  97

    题目链接:

    http://poj.org/problem?id=1065

    题意:

    C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

    题解:

    最小值其实等于按l递增排序后stick按w最长下降子序列的长度L

    就是求最长递减子序列。。 dp[i] := 长度为i+1的下降子序列中末尾元素的最大值

    代码:

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define MS(a) memset(a,0,sizeof(a)) #define MP make_pair #define PB push_back const int INF = 0x3f3f3f3f; const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ////////////////////////////////////////////////////////////////////////// const int maxn = 1e5+10; pair<int,int> sticks[maxn]; int ans[maxn]; int main(){ int T = read(); while(T--){ int n = read(); for(int i=0; i<n; i++){ cin >> sticks[i].first >> sticks[i].second; } sort(sticks,sticks+n); memset(ans,-1,sizeof(ans)); int mx = 0; for(int i=0; i<n; i++){ // int L=0,R=5001,p=1; // while(L<=R){ // int mid = (L+R)/2; // if(ans[mid] > sticks[i].second) p=mid+1,L=mid+1; // else R=mid-1; // } int p = lower_bound(ans+1,ans+1+n,sticks[i].second,greater<int>())-ans; ans[p] = sticks[i].second; mx = max(mx,p); } cout << mx << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-24311.html

    最新回复(0)