diff --git a/Dynamic_Programming/115.Distinct-Subsequences/115.Distinct-Subsequences.cpp b/Dynamic_Programming/115.Distinct-Subsequences/115.Distinct-Subsequences.cpp index e4266191e..dfba2ce32 100644 --- a/Dynamic_Programming/115.Distinct-Subsequences/115.Distinct-Subsequences.cpp +++ b/Dynamic_Programming/115.Distinct-Subsequences/115.Distinct-Subsequences.cpp @@ -20,10 +20,9 @@ class Solution { for (int j=1; j<=n; j++) { if (s[i]==t[j]) - dp[i][j] = dp[i-1][j] + dp[i-1][j-1]; + dp[i][j] = min(LLONG_MAX/2, dp[i-1][j] + dp[i-1][j-1]); else dp[i][j] = dp[i-1][j]; - //cout<& nums) + { + LL ret = 0; + for (int i = nums.size()-2; i>=0; i--) + { + LL x = nums[i+1]; + LL y = nums[i]; + if (y<=x) continue; + + if (y%x==0) + { + ret += y/x-1; + nums[i] = x; + } + else + { + int k = y/x+1; + ret += y/x; + nums[i] = y/k; + } + } + + return ret; + } +}; diff --git a/Greedy/2366.Minimum-Replacements-to-Sort-the-Array/Readme.md b/Greedy/2366.Minimum-Replacements-to-Sort-the-Array/Readme.md index 6ad7847fb..040c70502 100644 --- a/Greedy/2366.Minimum-Replacements-to-Sort-the-Array/Readme.md +++ b/Greedy/2366.Minimum-Replacements-to-Sort-the-Array/Readme.md @@ -1,5 +1,7 @@ ### 2366.Minimum-Replacements-to-Sort-the-Array +#### 解法1 + 我们从后往前看,对于最后一个数,我们肯定不会拆分。一旦将其拆分的话变小的话,那么前面的数就有更大的概率需要拆得更小。 接着假设最后一个数是x,倒数第二个数是y。如果y小于等于x,那么最后两个元素已经是递增关系,y就不用拆分了,理由同上。如果y大于x,那么就必须拆分y,那么怎么拆分呢? @@ -21,3 +23,6 @@ p <= (x-d) / (k+1) 此时这是不是最优的操作呢?并不是。如果`d2 < x2`,其实我们可以将k个x2里面的一部分(而不是整体)拿出1来再贡献给d2,必然可以使得d2再拉至于x2-1平齐的高度。这是因为之前我们知道,如果k个x2每人都再贡献1出来,会导致`d2`会比`x2-1`还大。所以这意味着,如果贡献出部分的1出来,就能让`d2`与`x2-1`持平。在这种情况下,`x2-1`就是拆分出来的k+1份里的最小值。 于是,这个回合结束我们将nums[i]赋值为`x2`(如果`d2==x2`)或者`x2-1`(如果`d2& nums, vector& target) + { + vectorodd1, odd2, even1, even2; + for (auto x: nums) + { + if (x%2==0) + even1.push_back(x); + else + odd1.push_back(x); + } + for (auto x: target) + { + if (x%2==0) + even2.push_back(x); + else + odd2.push_back(x); + } + + return helper(even1, even2) + helper(odd1, odd2); + } + + LL helper(vector&nums, vector&target) + { + sort(target.begin(), target.end()); + sort(nums.begin(), nums.end()); + + LL count = 0; + for (int i=0; i target[i]) + count += (nums[i]-target[i])/2; + + return count; + } + +}; diff --git a/Greedy/2449.Minimum-Number-of-Operations-to-Make-Arrays-Similar/Readme.md b/Greedy/2449.Minimum-Number-of-Operations-to-Make-Arrays-Similar/Readme.md new file mode 100644 index 000000000..63a124368 --- /dev/null +++ b/Greedy/2449.Minimum-Number-of-Operations-to-Make-Arrays-Similar/Readme.md @@ -0,0 +1,13 @@ +### 2449.Minimum-Number-of-Operations-to-Make-Arrays-Similar + +很显然题目的意思是,nums经过一系列操作之后,需要变成targets。于是nums和targets的数组元素之和必然相等,否则无法实现+2/-2的守恒。 + +另外,我们发现,偶数无论如何也无法操作成奇数,反之亦然。所以知道,需要将奇数偶数分开处理,即nums里的奇数需要多少操作转化为targets里的奇数,同理nums里的偶数需要多少操作否转化为targets里的偶数。 + +接下来,我们考虑只含有奇数的nums数组和只含有奇数的targets数组。很明显,我们必然会把nums[0]转化为targets[0],将nums[1]转化为targets[1],依次类推。这样能使得每对元素差的绝对值之和最小。简单的证明可以从两对开始研究。假设有`nums[i]

AltStyle によって変換されたページ (->オリジナル) /