Create Maximum Number

来源:互联网 发布:拼图游戏 算法 编辑:程序博客网 时间:2024/06/08 18:03

找了一份比较清晰的解释,DP+贪心:https://discuss.leetcode.com/topic/32252/c-dp-greedy-solution-should-be-easy-to-understand/5

最近没空仔细研究了,记录一下二刷的时候认真看看

class Solution {public:vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {vector<int> ans;if (!nums1.size() && !nums2.size() || !k)return ans;ans.resize(k);int n = nums1.size(), m = nums2.size();vector<string> dp1(min(k, n)), dp2(min(k, m));vector<string> dpprev1(n), dpcur1(n), dpprev2(m), dpcur2(m);//dp求最大子串for (int i = 0; i < dp1.size(); ++i) {string tmpval(i + 1, 0);dp1[i] = tmpval;if (!i) {for (int j = 0; j < n; ++j) {dpprev1[j] = "";dpprev1[j] += (char)(nums1[j] + '0');dp1[i] = max(dp1[i], dpprev1[j]);if (j)dpprev1[j] = max(dpprev1[j], dpprev1[j - 1]);}}else {for (int j = i; j < n; ++j) {dpcur1[j] = tmpval;dpcur1[j] = max(dpcur1[j], dpprev1[j - 1] + (char)(nums1[j] + '0'));dp1[i] = max(dp1[i], dpcur1[j]);if (j >= i)dpcur1[j] = max(dpcur1[j], dpcur1[j - 1]);}dpprev1 = dpcur1;}}//dp求最大子串for (int i = 0; i < dp2.size(); ++i) {string tmpval(i + 1, 0);dp2[i] = tmpval;if (!i) {for (int j = 0; j < m; ++j) {dpprev2[j] = "";dpprev2[j] += (char)(nums2[j] + '0');dp2[i] = max(dp2[i], dpprev2[j]);if (j)dpprev2[j] = max(dpprev2[j], dpprev2[j - 1]);}}else {for (int j = i; j < m; ++j) {dpcur2[j] = tmpval;dpcur2[j] = max(dpcur2[j], dpprev2[j - 1] + (char)(nums2[j] + '0'));dp2[i] = max(dp2[i], dpcur2[j]);if (j >= i)dpcur2[j] = max(dpcur2[j], dpcur2[j - 1]);}dpprev2 = dpcur2;}}string tmpans(k, 0), v = "";if (!dp1.size()) {getAns(v, dp2[k - 1], ans, tmpans);}else {for (int i = 0; i <= min(k, (int)dp1.size()); ++i) {if (i == 0) {if (dp2.size() >= k)getAns(v, dp2[k - 1], ans, tmpans);}else if (i < k) {if (dp2.size() >= k - i)getAns(dp1[i - 1], dp2[k - i - 1], ans, tmpans);}else {if (dp1.size() >= k)getAns(dp1[k - 1], v, ans, tmpans);}}}return ans;}private:void getAns(string &s1, string &s2, vector<int> &ans, string &tmpans) {string res;if (!s1.size())res = s2;else if (!s2.size())res = s1;else {int id1 = 0, id2 = 0;while (id1 < s1.size() && id2 < s2.size()) {if (s1[id1] > s2[id2]) {res += s1[id1++];}else if (s1[id1] < s2[id2]) {res += s2[id2++];}else {if (s1.substr(id1) >= s2.substr(id2))res += s1[id1++];elseres += s2[id2++];}}while (id1 < s1.size())res += s1[id1++];while (id2 < s2.size())res += s2[id2++];}//copyif (res > tmpans) {tmpans = res;for (int i = 0; i < res.size(); ++i)ans[i] = (res[i] - '0');}}};


0 0
原创粉丝点击