1. 程式人生 > >最長遞增(遞減)子序列

最長遞增(遞減)子序列

最長遞增序列
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

int main()
{
	int a[1000],n,d[0100];
	while(cin>>n){
		for(int i = 0; i < n; i ++)
			 {cin>>a[i];d[i]=1;}

		for(int i = 1; i < n; i ++)
			for(int j = 0; j < i; j ++)   //第i個跟前i-1個 嘗試組成序列 選擇能組成最長的的
				if(a[i] >= a[j])
					d[i] = max(d[i],d[j] + 1);
		int  max_= 0;

		for(int i = 0; i < n; i ++)  //拿出最長的來 也可以放在上面那個外層for迴圈裡
			if(max_ < d[i])
				max_= d[i];
	cout<<max_;
	}
	return 0;
}

同時,最長遞增子序列的長度,也是求改序列 最少遞減序列的個數,看的這個題,題意是求最少遞減序列個數,按上邊程式求最長遞增序列長度就ok

Problem Description 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈.
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.

Input 輸入若干組資料.每組資料包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)

Output 對應每組資料輸出攔截所有導彈最少要配備多少套這種導彈攔截系統.

Sample Input 8 389 207 155 300 299 170 158 65
Sample Output 2