960. Delete Columns to Make Sorted III(DP)

We are given an array A of N lowercase letter strings, all of the same length.

Now, we may choose any set of deletion indices, and for each string, we delete all the characters in those indices.

For example, if we have an array A = ["babca","bbazb"] and deletion indices {0, 1, 4}, then the final array after deletions is ["bc","az"].

Suppose we chose a set of deletion indices D such that after deletions, the final array has every element (row) in lexicographic order.

For clarity, A[0] is in lexicographic order (ie. A[0][0] <= A[0][1] <= ... <= A[0][A[0].length - 1]), A[1] is in lexicographic order (ie. A[1][0] <= A[1][1] <= ... <= A[1][A[1].length - 1]), and so on.

Return the minimum possible value of D.length.

 

Example 1:

Input: ["babca","bbazb"]
Output: 3
Explanation: After deleting columns 0, 1, and 4, the final array is A = ["bc", "az"].
Both these rows are individually in lexicographic order (ie. A[0][0] <= A[0][1] and A[1][0] <= A[1][1]).
Note that A[0] > A[1] - the array A isn't necessarily in lexicographic order.

Example 2:

Input: ["edcba"]
Output: 4
Explanation: If we delete less than 4 columns, the only row won't be lexicographically sorted.

Example 3:

Input: ["ghi","def","abc"]
Output: 0
Explanation: All rows are already lexicographically sorted.

思路:對每一個字符串元素,我們分析所有j < i,如果A[j] < A[i]對於所有字符串,那麼dp[i] = dp[j] + 1。運行時複雜度爲O(n * n * m),其中n是字符數,m是字符串數。

int minDeletionSize(vector<string>& A) {
  vector<int> dp(A[0].size(), 1);
  for (auto i = 0; i < A[0].size(); ++i) {
    for (auto j = 0; j < i; ++j)
      for (auto k = 0; k <= A.size(); ++k) {
        if (k == A.size()) dp[i] = max(dp[i], dp[j] + 1);
        else if (A[k][j] > A[k][i]) break;
      }
  }
  return A[0].size() - *max_element(begin(dp), end(dp));
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章