1. 程式人生 > >CSU 1225: ACM小組的佇列(最長上升子序列的個數)

CSU 1225: ACM小組的佇列(最長上升子序列的個數)

題目:

Description

ACM小組每次出去活動都要排隊,但是大家總是不想按照任何規則來排好這個隊伍(大概是因為每個人都比較有個性,例如Gestapolur),所以每次隊 伍都是亂的,不過Samsara今天突然想要計算一下隊伍中按身高升序排列的最長子佇列,而且還想知道最長的子佇列的個數。所謂子佇列,就是在佇列 A_1...A_i...A_n中的一個佇列A_p[1]...A_p[2]..A_p[m],(1<=p[1]<p[2]<...& lt;p[m]<=n,m<=n)。Samsara的統計學得非常不好,所以又要麻煩會程式設計的你來幫他解決這個難題了。

Input

每組資料兩行,第一行一個正整數n(1<=n<=1000),表示有n個人,第二行有用空格隔開的n個正整數A_1...A_i..A_n(1<=A_i<=200),表示這n個人的身高。

Output

輸出對應也有若干行,請輸出符合要求的最長子佇列的長度和個數,以空格隔開。

Sample Input

5
1 4 2 6 3

Sample Output

3 3

程式碼:

#include<iostream>
using namespace std;

int main()
{
	int k, h[1001], len[1001], num[1001];
	while (cin >> k)
	{
		for
(int i = 0; i < k; i++)cin >> h[i]; len[0] = 1, num[0] = 1; for (int i = 1; i < k; i++) { len[i] = 1, num[i] = 1; for (int j = 0; j < i; j++)if (h[j] < h[i]) { if (len[i] < len[j] + 1)len[i] = len[j] + 1, num[i] = num[j]; else if (len[i] == len[j] + 1)num[i] += num[j]; } } int
m = 0, ans = 0; for (int i = 0; i < k; i++)if (m < len[i])m = len[i], ans = num[i]; else if (m == len[i])ans += num[i]; cout << m << " " << ans << endl; } return 0; }