CSU 1225: ACM小組的佇列(最長上升子序列的個數)
阿新 • • 發佈:2019-01-04
題目:
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;
}