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); } }
相关文章推荐
- 千回百折:百度Java研发offer斩获记和经验分享
- 【转】如何自己开发一款js或者jquery插件
- Notification集合(一)
- sscanf()的用法
- Testng enabled example
- (原创)OrnLite数据库缓存的介绍以及使用、一对多三级关联表及其CRUD怎删查改等操作demo
- 数据库基本----SQL语句大全
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
- 两个导体盘之间的电场
- sar 找出系统瓶颈的利器
- 文件IO(不带缓存)与标准IO(带缓存流IO)的小结
- C++第五次作业
- ldd 查看程序依赖库
- 数据结构 笔记4 栈和队列
- 常见工具类(未完待续)
- Golang测试技术
- 对现有的控件进行拓展,以TextView为例,为文本加彩虹渐变效果
- TestNG Suites Example(java单元测试组件例子)
- gdb 调试利器
- 代码训练营——泛型之限定