只要理解了LIS,这道题稍微搞一下就行了。

求LIS(最长上升子序列)有两种方法:

1.O(n^2)的算法:设dp[i]为以a[i]结尾的最长上升子序列的长度。dp[i]最少也得是1,就初始化为1,则dp[i]=max(dp[i],dp[j]+1)(其中j<i且a[j]<a[i])。

int gao()
{
int ans=;
for(int i=;i<n;i++)
{
dp[i]=;
for(int j=;j<i;j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+);
}
}
ans=max(ans,dp[i]);
}
return ans;
}

O(n^2)

2.O(n*lgn)算法:有这样一个性质:如果上升子序列长度相同,那么最末尾最小的那种在之后的比较中最有优势(有点贪心的味道)。根据这个,设dp[i]为长度为i+1的上升子序列中末尾元素的最小值。开始dp全初始化为INF,每次更新时前面的dp都是排好序的,所以就可以二分来找。

int gao()
{
fill(dp,dp+n,INF);
for(int i=;i<n;i++)
{
*lower_bound(dp,dp+n,a[i])=a[i];
}
ans=lower_bound(dp,dp+n,INF)-dp;
}

O(n*lgn)

对于本题,要求输出第二长子序列的长度。那么就找LIS,如果LIS只有一种情况可以得到,那么输出LIS-1,否则输出LIS。

用num数组来记录能达到当前长度的方法数。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const int eps=1e-;
const int INF=;
const int maxn=+;
const LL mod=;
int T,n,a[maxn],dp[maxn],num[maxn];
int main()
{
//freopen("in8.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int ans=;
for(int i=; i<n; i++)
{
scanf("%d",&a[i]);
}
for(int i=; i<n; i++)
{
dp[i]=;
num[i]=;
for(int j=; j<i; j++)
{
if(a[j]<a[i])
{
if(dp[j]+>dp[i])
{
num[i]=num[j];
dp[i]=dp[j]+;
}
else if(dp[j]+==dp[i])
{
num[i]+=num[j];
}
}
}
if(dp[i]>ans)
{
ans=dp[i];
}
}
int num1=;
for(int i=;i<n;i++)
{
if(dp[i]==ans)
{
num1+=num[i];
}
}
if(num1==)
{
printf("%d\n",ans-);
}
else
{
printf("%d\n",ans);
}
}
//fclose(stdin);
//fclose(stdout);
return ;
}

最新文章

  1. IOS开发基础知识--碎片47
  2. HTML基础篇之列表相关标签和特殊字符实体
  3. 如何应用.NET中的消息队列服务
  4. Python-层次聚类-Hierarchical clustering
  5. AJAX笔记
  6. 理解ros服务和参数 ---- 7
  7. opatch auto in windows db in 11.2.0.4
  8. AD转换
  9. 一个特别好用的属性:inline-block
  10. Python os.walk() 方法遍历文件目录
  11. Linux配置snmp
  12. Omi框架学习之旅 - 获取DOM节点 及原理说明
  13. 7:CSS Sprites的原理(图片整合技术)
  14. CentOS下 NFS的简单使用以及windows 关在linux的NFS存储方法
  15. 【MySql 】is not allowed to connect to this MySql server 无法访问远程MySQL数据库
  16. 测试mktime和localtime_r性能及优化方法
  17. Problem A&amp;B: 开宝箱 1/2 (最沙雕的做法)(未用指针做) 改:附上一种指针做法
  18. 【css】 如何修改select的样式
  19. WinForm下的键盘事件(KeyPress、KeyDown)及如何处理不响应键盘事件
  20. 对reducers 理解

热门文章

  1. Computer Information
  2. GCE 创建一个Linux VM
  3. LeetCode:旋转链表【61】
  4. 前端 css续
  5. iOS oc 调用 swift
  6. Linux Shell编程 awk命令
  7. VMWare虚拟机安装步骤
  8. springboot-整合freemarker
  9. python中类(class)和实例(instance)
  10. python中偏函数