版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
};