# Greedy# Dynamic Programming# Sequence

f941 - Coder King

🔗 前往 ZeroJudge 原題

題目描述

題目描述了一個關於 Gino、Arik 和他們能力的奇幻故事。Arik 擁有將人變成數字的能力,而 Gino 則擁有 "Heaviest" 的能力。最終,Gino 被 Arik 變成了一串數字,而 Gayry 需要找到這串數字中最長非嚴格遞增子序列 (LIS) 的長度,才能救出 Gino。

解題思路

題目要求計算一串數字序列的最長非嚴格遞增子序列的長度。可以使用動態規劃或貪心算法來解決這個問題。由於題目限制了數字的範圍 (1, 2, 3),可以使用貪心算法優化動態規劃的空間複雜度。

具體來說,可以維護一個數組 tails,其中 tails[i] 表示所有長度為 i+1 的非嚴格遞增子序列的最小末尾元素。遍歷輸入序列,對於每個數字 num,如果 num 大於 tails 中所有元素,則將 num 添加到 tails 的末尾。否則,在 tails 中找到第一個大於等於 num 的元素,並將其替換為 num。最終,tails 的長度就是 LIS 的長度。

複雜度分析

  • 時間複雜度: O(n log n) (二分查找)
  • 空間複雜度: O(n)

程式碼

#include <stdio.h>
using namespace std;
int a[3];
char c;
inline void write(int x) {
	if(x==0)
		putchar_unlocked('0');
	else{
		int stk[9],*ptr(&stk[0]);
		while(x){*ptr=x%10;x/=10;++ptr;}
		while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
	}
}
int main(){
	while(1){
		c=getchar_unlocked();
		if(c=='1'){
			++a[0];
			if(a[1])--a[1];
			else if(a[2])--a[2];
		}
		else if(c=='2'){
			++a[1];
			if(a[2])--a[2];
		}
		else if(c=='3'){		
			++a[2];
		} 
		else{
			break;
		}
	}
	write(a[0]+a[1]+a[2]);
}

Discussion