hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)

链接:hdu 5087

题意:求第二大的最长升序子序列

分析:这里的第二大指的是,全部的递增子序列的长度(包含相等的),

从大到小排序后。排在第二的长度

BestCoder Round #16 上的第二题,注意
 1 1 2 这组数据,答案应为2

思路1.每次将最长的两个上升子序列长度记录。最后再排序,取第二大的就可以

思路2.假设最长的上升子序列长度(ans)唯一,那第二大应为ans-1

否则,第二大的就为 ans

[cpp] view
plain
copyprint?

  1. #include<stdio.h>
  2. #include<algorithm>
  3. using namespace std;
  4. int a[1010],dp[1010][2],ans[2010],n;
  5. int main()
  6. {
  7. int T,i,j,k,x,y;
  8. scanf("%d",&T);
  9. while(T--){
  10. scanf("%d",&n);
  11. for(i=0;i<n;i++)
  12. scanf("%d",&a[i]);
  13. k=0;
  14. for(i=0;i<n;i++){
  15. dp[i][0]=1;
  16. dp[i][1]=0;
  17. for(j=0;j<i;j++){
  18. if(a[j]<a[i]){
  19. x=dp[j][0]+1;
  20. y=dp[j][1]+1;
  21. if(x>dp[i][0])   //更新最大的两个长度
  22. swap(x,dp[i][0]);
  23. if(x>y)
  24. swap(x,y);
  25. if(y>dp[i][1])
  26. dp[i][1]=y;
  27. }
  28. }
  29. ans[k++]=dp[i][0];  //将每次最大的两个值记录下来
  30. ans[k++]=dp[i][1];
  31. }
  32. sort(ans,ans+k);
  33. printf("%d\n",ans[k-2]); //输出排序后第二大的
  34. }
  35. return 0;
  36. }

[cpp] view
plain
copyprint?

  1. #include<stdio.h>
  2. #include<string.h>
  3. #define max(a,b) a>b?

    a:b
  4. int a[1010],dp[1010],num[1010],n;
  5. int main()
  6. {
  7. int T,i,j,cnt,ans;
  8. scanf("%d",&T);
  9. while(T--){
  10. scanf("%d",&n);
  11. for(i=0;i<n;i++)
  12. scanf("%d",&a[i]);
  13. ans=1;
  14. for(i=0;i<n;i++){
  15. num[i]=dp[i]=1;
  16. for(j=0;j<i;j++){
  17. if(a[j]<a[i]&&dp[j]+1>dp[i]){
  18. dp[i]=dp[j]+1;
  19. num[i]=num[j];   //记录出现的次数
  20. }
  21. else if(a[j]<a[i]&&dp[j]+1==dp[i])
  22. num[i]+=num[j];   //记录出现的次数
  23. }
  24. ans=max(ans,dp[i]); //记录最大值
  25. }
  26. cnt=0;
  27. for(i=0;i<n;i++)
  28. if(dp[i]==ans)
  29. cnt+=num[i];  //计算最大值出现的总次数
  30. if(cnt==1)          //这里改成cnt>1输出ans,否则ans-1,wrong了,非常郁闷
  31. printf("%d\n",ans-1);
  32. else
  33. printf("%d\n",ans);
  34. }
  35. return 0;
  36. }
时间: 2024-11-11 23:49:34

hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)的相关文章

hdu 5087 Revenge of LIS II(LIS)

题目连接:hdu 5087 Revenge of LIS II 题目大意:给定一个序列,求第2长的LIS长度. 解题思路:用o(n^2)的算法求LIS,每个位置维护两个值,最大和最小即可.注意的是dp[0]中的最大第二大不能都复制成0. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1005; int N, A[maxn],

hdu 5088 Revenge of Nim II(高斯消元)

题目链接:hdu 5088 Revenge of Nim II 题目大意:Nim游戏的变形,因为游戏很不公平,所以现在转变规则,后手可以选取若干堆石子剔除,剩下堆的石子用 来进行游戏,问说后手可能胜利吗. 解题思路:其实即为取出非0堆石子,使得Nim和为0.因为是Nim和(亦或),所以以每个位建立方程,列出40个方 程,进行亦或形式的高斯消元,因为全0肯定为一解,所以方程肯定有解,那么存在多解的情况即为存在自有变元. #include <cstdio> #include <cstring

线段树求LIS并统计最长子序列个数

以下面的题目为例(题目和代码在最后面),给定一个数列(长度最大为10000),求出最长的先增后减子序列长度及个数.做法是先求出以每一个位置结尾的最长单增子序列长度以及以该位置开头的最长单减子序列长度,然后遍历所有位置找出最大先增后减子序列长度. 以最长单增序列(LIS)为例,由于不仅需要整个序列LIS的长度,还要保存以每个位置为结尾位置的LIS长度.记以a[i]结尾的LIS长度为dp[i],则 dp[i] = max{dp[j] | a[j] < a[i]} + 1 这就是一个RMQ问题,涉及单

hdoj 5087 Revenge of LIS II 【第二长单调递增子】

称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O(n^2)的时间求单调递增子序列的时候,里面在加一层循环维护sum数组.表示前面有几个能够转移当当前,求前面sum的和保存到当前. 最后求最后一个sum[n-1]是否为1就ok.为1的话在最长的基础上减一,否则就是最长的. AC代码: #include <iostream> #include &l

hdoj 5087 Revenge of LIS II 【第二长单调递增子序列】

题目:hdoj 5087 Revenge of LIS II 题意:很简单,给你一个序列,让你求第二长单调递增子序列. 分析:其实很简单,不知道比赛的时候为什么那么多了判掉了. 我们用O(n^2)的时间求单调递增子序列的时候,里面在加一层循环维护sum数组,表示前面有几个可以转移当当前,求前面sum的和保存到当前. 最后求最后一个sum[n-1]是否为1就ok,为1的话在最长的基础上减一,否则就是最长的. AC代码: #include <iostream> #include <algor

HDU 5087 Revenge of LIS II(次长上升子序列)

题意  求一个序列的所有上升子序列中第二长的那个的长度 简单的dp   d[i]表示以第i个数结尾的最长上升子序列的长度  c[i]表示到达d[i]的方法数  如序列1 1 2  d[3]=2,c[3]=2  因为选1 3位置和 2 3位置的都可以得到d[3]=2 递推过程很简单 d[i]=max{d[j]+1}其中a[i]>a[j]&&i>j 最后看d[1~n]中最大的数出现了几次  出现了不止一次就直接输出否则就减一输出咯 #include <cstdio> #

hdu 5087 Revenge of LIS II lcs变形

点击打开链接链接 Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1028    Accepted Submission(s): 334 Problem Description In computer science, the longest increasing subsequence proble

hdu 5087 Revenge of LIS II(BestCoder Round #16)

Revenge of LIS II                                                  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 528    Accepted Submission(s): 173 Problem Description In computer science, th

HDU 5087 Revenge of LIS II(次大递增子序列)

Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1258    Accepted Submission(s): 423 Problem Description In computer science, the longest increasing subsequence problem is to f