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])
具体实现代码如下:
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; } };
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap