# Greedy# Array# Iteration

e588 - 12385 - Interesting Sequences

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出一個整數序列中,互不衝突的 "interesting" 子序列的最大數量。"interesting" 子序列是指首尾元素相同的子序列,而互不衝突的子序列是指它們之間沒有重疊。

解題思路

本題採用貪心策略。首先,使用一個陣列 c 記錄每個數字最後出現的位置。然後,遍歷輸入序列,統計每個位置的元素作為 "interesting" 子序列結尾的次數,儲存在 ma 陣列中。接著,從序列的開頭開始,每次選擇最靠右邊的、且有元素作為結尾的 "interesting" 子序列,並將其包含的元素從 ma 陣列中移除。重複此過程,直到遍歷完整個序列。

複雜度分析

  • 時間複雜度: O(n)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
using namespace std;
int a[100005][2],ma[100005],c[100005],n,t;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> t;
	while(t--){
		cin >> n;
		for(int i=0;i<=100000;++i){
			c[i]=n;
			a[i][1]=n;
			ma[i]=0;
		}
		int it=0,ans=0;
		for(int i=0;i<n;++i){
			cin >> a[i][0];
			if(c[a[i][0]]!=n){
				a[c[a[i][0]]][1]=i;
			}
			c[a[i][0]]=i;
		}
		for(int i=0;i<n;++i){
			ma[a[i][1]]++;
		}
		int tmp=0;
		while(it<n){
			for(int i=it;i<=n;++i){
				if(ma[i]){
					tmp=i;
					break;	
				}
			}
			if(tmp<n){
				++ans;
				for(int i=it;i<tmp;++i){
					ma[a[i][1]]--;
				}
			}
			it=tmp;
		}
		cout << ans << "\n";
	}
}

Discussion