hdu 1160 排序 + 最长上升子序列

题意:

  • 输出体重上升而速度下降的最长子序列

题意:

  • 先按照结构体升序排序体重,之后用dp对速度求最长下降子序列即可。

代码:

#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int M = 1009,INF = 0x3fffffff;
struct place {int x, y, z;} a[M];
pair<int, int> dp[M];
bool cmp(struct place a, struct place b) {
    if(a.x == b.x) return a.y > b.y;
    if(a.x < b.x) return true;
    return false;
}

int main(void) {
    //problem:hdu 1160  address:http://acm.hdu.edu.cn/showproblem.php?pid=1160
    int n = 0;
    while(cin >> a[n].x >> a[n].y) {
        a[n].z = n + 1;
        n++;
    }
    sort(a, a + n, cmp);
    //for(int i = 0; i < n; i++) cout << a[i].x << " " << a[i].y << " " << a[i].z << endl;
    for(int i = 0; i < n; i++) dp[i].first = 1;
    int ans = 0, key = 0;
    for(int i = 0; i < n; i++) {
        for(int j = i - 1; j >= 0; j--) {
            if(a[i].x != a[j].x && a[i].y < a[j].y && dp[i].first < dp[j].first + 1) {
                dp[i].second = j;
                dp[i].first = dp[j].first + 1;
            }
        }
        //for(int ii = 0; ii < n; ii++) cout << dp[ii].first << " " << dp[ii].second << "   ";
        //cout << endl;
        if(ans <= dp[i].first) {key = i; ans = dp[i].first;}
    }
    cout << ans << endl;
    stack<int> s;
    while(ans--) {
        s.push(a[key].z);
        key = dp[key].second;
    }
    while(!s.empty()) {
        cout << s.top() << endl;
        s.pop();
    }
    return 0;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。