您的位置:首页 > 运维架构

leetcode_354.Russian Doll Envelopes

2016-07-11 15:17 337 查看
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.

What is the maximum number of envelopes can you Russian doll? (put one inside other)

Example:

Given envelopes = [[5,4],[6,4],[6,7],[2,3]], the maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]).

题意:

这个题目意思就是给你一些二元序列,代表信封的w(宽)和h(高),当信封i和j,满足w(i) > w(j) && h(i) > h(j)时,j可装进i里面,问你最多能把多少只信封一个接一个地装进另外的信封里面。

这个题目可以用DP(动态规划)解决,最优子结构性质用反证法很好证明。具体分析如下:

为了在遍历时,确保后面的信封不能装进前面的信封里面(即保证,只允许前面的信封装进后面的信封),需将序列自定义排序。

对于第i个信封,该信封一定为前i个中最”大”的信封(即 任意 0 < j < i, w(i) >= w(j), h(i) >= h(j)),因此,我们考虑,当以i为最大的信封时,max(i)的值 ret[i],有如下状态转移方程:

ret[i] = max(ret[j] +1) 0 < j < i && w(j) < w(i) && h(j) < h(i)

ret[i] = 1 对于所有的 0 < j < i 都有 w(j) >= w(i) || h(j) >= h(i)

最优解 sol = max(ret[i])

具体实现代码如下:

//c++
bool cmp(pair<int, int> &a, pair<int, int> &b){
if(a.first != b.first) return a.first < b.first;
else return a.second < b.second;
}
class Solution {
public:
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
sort(envelopes.begin(), envelopes.end(), cmp);
if(envelopes.size() <= 1) return envelopes.size();
vector<int> ret(envelopes.size(), 0);
ret[0] = 1;
int sol = 0;
for(int i = 1; i < envelopes.size(); i++){
int maxs = 0;
for(int j = 0; j < i; j++){
if(envelopes[i].second > envelopes[j].second && envelopes[i].first > envelopes[j].first){
maxs = max(maxs, ret[j] + 1);
}
}
ret[i] = max(maxs, 1);
}
for(int i = 0; i < envelopes.size(); i++){
sol =max(sol, ret[i]);
}
return sol;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode DP