Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- https://leetcode.com/problems/minimum-cost-to-split-an-array/
- You are given an integer array nums and an integer k.
- Split the array into some number of non-empty subarrays. The cost of a split is the sum of the importance value of each subarray in the split.
- Let trimmed(subarray) be the version of the subarray where all numbers which appear only once are removed.
- For example, trimmed([3,1,2,4,3,4]) = [3,4,3,4].
- The importance value of a subarray is k + trimmed(subarray).length.
- For example, if a subarray is [1,2,3,3,3,4,4], then trimmed([1,2,3,3,3,4,4]) = [3,3,3,4,4].The importance value of this subarray will be k + 5.
- Return the minimum possible cost of a split of nums.
- A subarray is a contiguous non-empty sequence of elements within an array.
- Example 1:
- Input: nums = [1,2,1,2,1,3,3], k = 2
- Output: 8
- Explanation: We split nums to have two subarrays: [1,2], [1,2,1,3,3].
- The importance value of [1,2] is 2 + (0) = 2.
- The importance value of [1,2,1,3,3] is 2 + (2 + 2) = 6.
- The cost of the split is 2 + 6 = 8. It can be shown that this is the minimum possible cost among all the possible splits.
- Example 2:
- Input: nums = [1,2,1,2,1], k = 2
- Output: 6
- Explanation: We split nums to have two subarrays: [1,2], [1,2,1].
- The importance value of [1,2] is 2 + (0) = 2.
- The importance value of [1,2,1] is 2 + (2) = 4.
- The cost of the split is 2 + 4 = 6. It can be shown that this is the minimum possible cost among all the possible splits.
- Example 3:
- Input: nums = [1,2,1,2,1], k = 5
- Output: 10
- Explanation: We split nums to have one subarray: [1,2,1,2,1].
- The importance value of [1,2,1,2,1] is 5 + (3 + 2) = 10.
- The cost of the split is 10. It can be shown that this is the minimum possible cost among all the possible splits.
- Constraints:
- 1 <= nums.length <= 1000
- 0 <= nums[i] < nums.length
- 1 <= k <= 10^9
- ---------------------------------------------------------------------------------------------------------------------------------------
- class Solution {
- public:
- vector<vector<int>> trimDP;
- vector<int> dp;
- int helper(vector<int> &nums, int curr, int k){
- if(curr==nums.size()){
- return 0;
- }
- if(dp[curr]!=-1){
- return dp[curr];
- }
- int res=INT_MAX;
- for(int i=curr;i<nums.size();i++){
- int trimmedLen=trimDP[curr][i];
- res=min(res,k+trimmedLen+helper(nums,i+1,k));
- }
- return dp[curr]=res;
- }
- int minCost(vector<int>& nums, int k) {
- int n=nums.size();
- trimDP.resize(n,vector<int>(n,0));
- dp.resize(n,-1);
- for(int i=0;i<n;i++){
- int dirt=0;
- int freq[1000]={0};
- int unique=0;
- for(int j=i;j<n;j++){
- freq[nums[j]]++;
- if(freq[nums[j]]==1){
- unique++;
- }
- if(freq[nums[j]]==2){ // this has repeated again, we cannot remove this NON UNQIUE number anymore
- dirt++;
- }
- int totalLen=j-i+1;
- trimDP[i][j]=totalLen-unique+dirt;
- }
- }
- return helper(nums,0,k);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment