動態規劃:單調遞增子序列

需求

描述

給定一個長度爲N的數組,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。
例如:給定一個長度爲6的數組A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列爲{5,6,7,8},長度爲4.
第一行輸入序列長度N(1<=N<=1000)
第二行輸入序列中的N個整數,取值範圍0到10000
輸出最長子序列長度

輸入

7
1 7 3 5 9 4 8

輸出

4

分析

從最左邊開始,計算出從字符串起始位置到每一個位置的最長單調遞增子序列的長度,那麼下一個位置的最長單調遞增子序列的長度可以由下列的狀態轉移方程得到。

代碼

#include <iostream>
#include <algorithm>
using namespace std;
int arr[1010];
int maxLen[1010];
int main() {
  //freopen("f:\\data.txt", "r", stdin);
  //錄入數據
  int N;
  cin >> N;
  for (int i = 1; i <= N; i++) {
    cin >> arr[i];
    maxLen[i] = 1;
  }
  //計算每個位置單調遞增子序列的最大長度
  for (int i = 2; i <= N; i++) {
    for (int j = 1; j < i; j++) {
      if (arr[j] < arr[i]) maxLen[i] = max(maxLen[i], maxLen[j] + 1);
    }
  }
  //輸出其中的最大值
  cout << *max_element(maxLen + 1, maxLen + N) << endl;
  return 0;
}

測試

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