CSU 1225 最长上升子序列并记录其个数

 1 for(int j=0;j<i;j++){
 2                 if(h[i] > h[j]){
 3                     if(len[i] == len[j] + 1) cnt[i]+=cnt[j];
 4                     if(len[i] < len[j] + 1) len[i] = len[j] + 1 , cnt[i] = cnt[j];
 5                 }
 6                 //身高相同的情况统计
 7             /*else if(h[i] == h[j]){
 8                     if(len[i] == len[j]) cnt[i] += cnt[j];
 9                     if(len[i] < len[j]) len[i] = len[j] , cnt[i] = cnt[j];
10                 }*/
11             }        

这道题需要注意的一点是如果出现身高相同的情况,那么这两个人不管谁站在队列中只算一种情况:如上面的代码所示,如果相同也统计那么就会报错,但是样例因为没有相同高度所以可以过

len[i] 表示前i个对象能构建的最长的子序列长度

cnt[i] 表示前i个对象构建的最长子序列长度的个数

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define max(a,b) a>b?a:b
 5 const int N = 1005;
 6 int h[N] , len[N] , cnt[N];
 7 int main()
 8 {
 9     freopen("test.in","rb",stdin);
10     int n;
11     while(scanf("%d",&n)!=EOF){
12         memset(len , 0 ,sizeof(len));
13         memset(cnt , 0 ,sizeof(cnt));
14         len[0] = 1 , cnt[0] = 1;
15         for(int i = 0;i < n;i++)
16         {
17             len[i] = cnt[i] = 1;
18             scanf("%d",h+i);
19             for(int j=0;j<i;j++){
20                 if(h[i] > h[j]){
21                     if(len[i] == len[j] + 1) cnt[i]+=cnt[j];
22                     if(len[i] < len[j] + 1) len[i] = len[j] + 1 , cnt[i] = cnt[j];
23                 }
24                 /*else if(h[i] == h[j]){
25                     if(len[i] == len[j]) cnt[i] += cnt[j];
26                     if(len[i] < len[j]) len[i] = len[j] , cnt[i] = cnt[j];
27                 }*/
28             }
29         }
30         int max_len = 0 , cnt_all = 0;
31         for(int i=0;i<n;i++){
32             max_len = max(max_len , len[i]);
33         }
34         for(int i=0;i<n;i++){
35             if(max_len == len[i])
36                 cnt_all += cnt[i];
37         }
38         printf("%d %d\n",max_len,cnt_all);
39     }
40     return 0;
41 }
时间: 2024-10-09 14:09:39

CSU 1225 最长上升子序列并记录其个数的相关文章

(最长上升子序列 并记录过程)FatMouse&#39;s Speed -- hdu -- 1160

http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12338    Accepted Submission(s): 5405Special Judge Problem Description FatMouse be

【最长下降子序列的长度和个数】 poj 1952

转自http://blog.csdn.net/zhang360896270/article/details/6701589 这题要求最长下降子序列的长度和个数,我们可以增加数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度)和maxnum[size](记录1~i之间的最长下降序列个数 ),首先对于最长下降序列属于DP基础题,只要对每一个a[i]求出符合要求(a[i] < a[j])的max( maxlen[j] + 1)即可,主要难点在第二步求下降序列总数 在序列中,

【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数字替换,最终形成一个1~N的排列,求这个排列的最长上升子序列长度为N-1的方案数. 题目思路: [模拟] 这道题需要分类讨论. 首先可以肯定,一个长度为n的序列最长上升子序列长度为n-1(最长下降子序列长度为2),那么这个序列的样子是1~n从小到大排列后其中一个数字挪到其余数字中间(错位) 一个长度为L的

Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)

Longest Ordered Subsequence A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence ( a1, a2, ..., aN) be any sequence ( ai1, ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N.

O(nlogn)的最长上升子序列并且记录所选择的数 模板

#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 10000 + 10; int A[MAXN]; int lis[MAXN]; int f[MAXN]; int stack[MAXN

动规讲解基础讲解七——最长单增子序列

(LIS Longest Increasing Subsequence)给定一个数列,从中删掉任意若干项剩余的序列叫做它的一个子序列,求它的最长的子序列,满足子序列中的元素是单调递增的. 例如给定序列{1,6,3,5,4},答案是3,因为{1,3,4}和{1,3,5}就是长度最长的两个单增子序列. 处看此题,怎么做? 万能的枚举?枚举全部2^n个子序列,找出最长的,固然可以,就是复杂度太高.我们为什么要枚举呢?因为要知道取了哪些数,其实我们只需要考虑上一个数和取了几个数就可以了吧?因为单增的意思

(hdu step 3.2.4)FatMouse&#39;s Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1034 Accepted Submission(s): 526   Proble

[ACM] 九度OJ 合唱队形 (最长递增子序列改版)

题目1131:合唱队形 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1680 解决:520 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, -, K,他们的身高分别为T1, T2, -, TK, 则他们的身高满足T1 < T2 < - < Ti , Ti > Ti+1 > - > TK (1 <= i <=

hdu-1160 FatMouse&#39;s Speed 【最长上升子序列】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9965    Accepted Submission(s): 4427 Special Judge Problem Description FatMo