叠罗汉II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iov3Rain/article/details/90243346

题目描述

叠罗汉是一个著名的游戏,游戏中一个人要站在另一个人的肩膀上。为了使叠成的罗汉更稳固,我们应该让上面的人比下面的人更轻一点。现在一个马戏团要表演这个节目,为了视觉效果,我们还要求下面的人的身高比上面的人高。请编写一个算法,计算最多能叠多少人,注意这里所有演员都同时出现。

给定一个二维int的数组actors,每个元素有两个值,分别代表一个演员的身高和体重。同时给定演员总数n,请返回最多能叠的人数。保证总人数小于等于500。

测试样例:

[[1,2],[3,4],[5,6],[7,8]],4

返回:4

最长上升序列变形。在叠罗汉I的问题上再加上了新的条件。

与叠罗汉I不同的是这里的演员都是同时出现。

将二维转换为一维。将多维降维,降低复杂度和难度。

先按体重排序,再按身高求上升子序列,因为结果的序列中体重一定是从小到大排序的。

反过来也可以。

class Stack {
public:
    int getHeight(vector<vector<int> > actors, int n) {
        // write code here
        if(n <= 0)
            return 0;
        sort(actors.begin(), actors.end(), [](vector<int> &v1, vector<int> &v2) ->bool{
            return v1[0] < v2[0];});
        vector<int> dp(n, 1);
        int ans = 1;
        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < i; ++j)
            {
                if(actors[i][1] > actors[j][1])
                    dp[i] = max(dp[i], dp[j] + 1);
            }
            ans = max(dp[i], ans);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/iov3Rain/article/details/90243346
ii