您的位置:首页 > 其它

ACM小组的队列 coj 1225

2016-05-10 00:24 288 查看


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


HINT

#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int a[10000];
int num[10000],dp[10000];
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);

for(int i=0;i<n;i++)
dp[i]=1,num[i]=1;
//memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[i]>a[j])
{
if(dp[i]==dp[j]+1)
num[i]+=num[j];
else if(dp[i]<dp[j]+1)
{
dp[i] = dp[j]+1;
num[i] = num[j];
}
}
}
}
int ans=0,sum=0;
for(int i=0;i<n;i++)
{
if(ans==dp[i])
sum+=num[i];
if(ans<dp[i])
{
ans=dp[i];
sum=num[i];
}

}

printf("%d %d\n",ans,sum);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: