题意分析:给定一些信封的宽和长,当且仅当信封x的宽和长均小于另一个信封y时,x可以装入y,求最多可以嵌套的装几个?
解题思路:
利用动态规划进行求解。首先利用信封的宽度进行排序,然后遍历信封,找长度满足条件的信封数目,从而更新dp数组,dp[i] = max(dp[i], dp[j+1])。同时更新result,result= max(result, dp[i])即可。
C++实现
// 排序然后查找实现 int maxEnvelopes(vector< pair<int, int> > &envelopes) { int result = 0; int n = envelopes.size(); // 初始值均为1 vector<int> dp(n, 1); // 按照信封的宽度进行排序 sort(envelopes.begin(), envelopes.end()); for (int i = 0; i < n; i++) { // 从最开始遍历,找符合条件的信封数 for (int j = 0; j < i; j++) { // 长宽满足条件,利用动态规划递推式更新dp数组中对应的值 if (envelopes[i].first > envelopes[j].first && envelopes[i].second > envelopes[j].second) { dp[i] = max(dp[i], dp[j] + 1); } } result = max(result, dp[i]); } return result; }
Java实现
public int maxEnvelopes(int[][] envelopes) { int result = 0; int n = envelopes.length; // 初始化dp值 int[] dp = new int[n]; for (int i = 0; i < n; i++) dp[i] = 1; // 按照宽度进行排序 Arrays.sort(envelopes, new Comparator<int[]>() { public int compare(int[] x, int[] y) { return x[0] - y[0]; } }); for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { // 找同时符合条件的信封,更新dp值 if (envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1]) dp[i] = Math.max(dp[i], dp[j] + 1); } result = Math.max(result, dp[i]); } return result;
}
参考文献
leetcode_354 Russian Doll Envelopes
最新推荐文章于 2021-09-25 23:54:10 发布