Given two strings str1 and str2, return the shortest string that has both str1 and str2 as subsequences. If multiple answers exist, you may return any of them.
(A string S is a subsequence of string T if deleting some number of characters from T (possibly 0, and the characters are chosen anywherefrom T) results in the string S.)
Example 1:
Input: str1 = "abac", str2 = "cab"
Output: "cabac"
Explanation:
str1 = "abac" is a substring of "cabac" because we can delete the first "c".
str2 = "cab" is a substring of "cabac" because we can delete the last "ac".
The answer provided is the shortest such string that satisfies these properties.
Note:
1 <= str1.length, str2.length <= 1000
str1 and str2 consist of lowercase English letters.
Solution: LCS
Find the LCS (longest common sub-sequence) of two strings, and insert unmatched characters into the LCS.
Given an integer array A, you partition the array into (contiguous) subarrays of length at most K. After partitioning, each subarray has their values changed to become the maximum value of that subarray.
Return the largest sum of the given array after partitioning.
Example 1:
Input: A = [1,15,7,9,2,5,10], K = 3
Output: 84
Explanation: A becomes [15,15,15,9,10,10,10]
Note:
1 <= K <= A.length <= 500
0 <= A[i] <= 10^6
Solution: DP
Time complexity: O(n*k) Space complexity: O(n)
dp[i] := max sum of A[1] ~ A[i] init: dp[0] = 0 transition: dp[i] = max{dp[i – k] + max(A[i-k:i]) * k}, 1 <= k <= min(i, K) ans: dp[n]
There are N piles of stones arranged in a row. The i-th pile has stones[i] stones.
A move consists of merging exactly K consecutive piles into one pile, and the cost of this move is equal to the total number of stones in these K piles.
Find the minimum cost to merge all piles of stones into one pile. If it is impossible, return -1.
Example 1:
Input: stones = [3,2,4,1], K = 2
Output: 20
Explanation:
We start with [3, 2, 4, 1].
We merge [3, 2] for a cost of 5, and we are left with [5, 4, 1].
We merge [4, 1] for a cost of 5, and we are left with [5, 5].
We merge [5, 5] for a cost of 10, and we are left with [10].
The total cost was 20, and this is the minimum possible.
Example 2:
Input: stones = [3,2,4,1], K = 3
Output: -1
Explanation: After any merge operation, there are 2 piles left, and we can't merge anymore. So the task is impossible.
Example 3:
Input: stones = [3,5,1,2,6], K = 3
Output: 25
Explanation:
We start with [3, 5, 1, 2, 6].
We merge [5, 1, 2] for a cost of 8, and we are left with [3, 8, 6].
We merge [3, 8, 6] for a cost of 17, and we are left with [17].
The total cost was 25, and this is the minimum possible.
Note:
1 <= stones.length <= 30
2 <= K <= 30
1 <= stones[i] <= 100
Solution: DP
dp[i][j][k] := min cost to merge subarray i ~ j into k piles Init: dp[i][j][k] = 0 if i==j and k == 1 else inf ans: dp[0][n-1][1] transition: 1. dp[i][j][k] = min{dp[i][m][1] + dp[m+1][j][k-1]} for all i <= m < j 2. dp[i][j][1] = dp[i][j][K] + sum(A[i]~A[j])
Time complexity: O(n^3) Space complexity: O(n^2*K)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Running time: 12 ms, 12.1 MB
classSolution{
public:
intmergeStones(vector<int>& stones, int K) {
const int n = stones.size();
if((n-1)%(K-1))return-1;
constintkInf=1e9;
vector<int>sums(n+1);
for(inti=0;i<stones.size();++i)
sums[i+1]=sums[i]+stones[i];
// dp[i][j][k] := min cost to merge subarray i~j into k piles.
std::function<int(int,int,int)>dp=[&stones, &sums, &cache, kInf, n, K, &dp](int i, int j, int k) {
if ((j - i + 1 - k) % (K - 1)) return kInf;
if(i==j)returnk==1?0:kInf;
if(cache[i][j][k]!=INT_MAX)returncache[i][j][k];
if(k==1)
returncache[i][j][k]=dp(i,j,K)+sums[j+1]-sums[i];
intans=kInf;
for(intm=i;m<j;m+=K-1){
intl=dp(i,m,1);
if(l>=ans)continue;
intr=dp(m+1,j,k-1);
if(r>=ans)continue;
ans=min(ans,l+r);
}
returncache[i][j][k]=ans;
};
returndp(0,n-1,1);
}
};
Solution 2: DP
dp[l][i] := min cost to merge [i, i + l) into as less piles as possible. Number of merges will be (l-1) / (K – 1) and Transition: dp[l][i] = min(dp[m][i] + dp[l – m][i + m]) for 1 <= m < l if ((l – 1) % (K – 1) == 0) [i, i + l) can be merged into 1 pile, dp[l][i] += sum(A[i:i+l])
Time complexity: O(n^3 / k) Space complexity: O(n^2)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Author: Huahua 4ms, 9.6 MB
classSolution{
public:
intmergeStones(vector<int>& stones, int K) {
const int n = stones.size();
if((n-1)%(K-1))return-1;
vector<int>sums(n+1);
for(inti=0;i<stones.size();++i)
sums[i+1]=sums[i]+stones[i];
constintkInf=1e9;
// dp[i][j] := min cost to merge subarray A[i] ~ A[j] into (j-i)%(K-1) + 1 piles
vector<vector<int>>dp(n,vector<int>(n,kInf));
for(inti=0;i<n;++i)dp[i][i]=0;
for(intl=2;l<=n;++l)// subproblem length
for(inti=0;i<=n-l;++i){// start
intj=i+l-1;
for(intm=i;m<j;m+=K-1)// split point
dp[i][j]=min(dp[i][j],dp[i][m]+dp[m+1][j]);
// If the current length can be merged into 1 pile