uva 10131 Is Bigger Smarter?(动态规划:LIS变形+路径打印)

来源:互联网 发布:网络机顶盒如何更新 编辑:程序博客网 时间:2024/05/22 11:33

如果按照w排序,则只需求s的最长下降子序列即可

这道题难点就在于路径打印,但是因为要求打印任意一条

这就好处理多了

注意下细节即可

代码如下:

#include <vector>#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 1010using namespace std;int dp[MAXN];vector<int> vec;struct Elepant {    int w, s, id;}a[MAXN];bool cmp(Elepant c, Elepant d) {    if(c.w < d.w) {        return true;    }     if(c.w == d.w)        return c.s > d.s;    return false;}void dfs(int pos) {    if(pos < 1) return ;    for(int i=pos-1; i>=0; --i) {        if(dp[pos] == dp[i]+1 && a[pos].w>a[i].w && a[pos].s<a[i].s) {            vec.push_back(a[i].id);            dfs(i);            break;        }    }    return ;}int main(void) {    int cnt = 0;    while(scanf("%d%d", &a[cnt].w, &a[cnt].s) != EOF) {         a[cnt].id = cnt+1;        ++cnt;     }    a[cnt].id = cnt+1;    ++cnt;    sort(a, a+cnt, cmp);    for(int i=0; i<cnt; ++i) {        dp[i] = 1;    }    for(int i=0; i<cnt; ++i) {        for(int j=i+1; j<cnt; ++j) {            if(a[j].w>a[i].w && a[j].s<a[i].s)                dp[j] = max(dp[j], dp[i]+1);        }    }/*    for(int i=0; i<cnt; ++i)        printf("%d\t%d\t%d\n", a[i].w, a[i].s, dp[i]);*/    int ans = -1;    int pos, res;    for(int i=0; i<cnt; ++i) {        if(ans <= dp[i]) {            ans = dp[i];            pos = i;            res = a[i].id;        }    }    printf("%d\n", ans);    vec.clear();    vec.push_back(res);    dfs(pos);    for(int i=vec.size()-1; i>=0; --i)        printf("%d\n", vec[i]);    return 0;}


0 0