UVa10534 Wavio Sequence
2015-10-07 22:23
441 查看
1.题目描述:点击打开链接
2.解题思路:本题是一道需要求解LIS的题目,因为n的范围比较大,这里需要利用O(NlogN)的算法来求解。首先,求出从左往右的LIS和从右往左的LIS(即从左往右的LDS)。那么,最终只需要扫描一遍,答案为2*min(LIS[i],LDS[i])-1。因为如果LIS[i]有k个元素且LIS[i]<LDS[i],那么相应的LDS中一定可以找到k个下降的子序列。由于在i处的元素重复计算了一次,因此要-1。
3.代码:
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<list>
#include<complex>
#include<functional>
using namespace std;
#define me(s) memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
typedef long long ll;
typedef pair <int,int> P;
const int N=10000+10;
int a
,LIS
,LDS
,buf
;
void getLIS(int*aa,int*bb,int n)
{
int k=0;
buf[k++]=aa[0];
bb[0]=1;
for(int i=1;i<n;i++)
if(aa[i]>buf[k-1])
{
buf[k++]=a[i];
bb[i]=k;
}
else
{
int*lb=lower_bound(buf,buf+k,aa[i]);
*lb=aa[i];
bb[i]=lb-buf+1;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
me(buf);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
getLIS(a,LIS,n);
reverse(a,a+n);
getLIS(a,LDS,n);
reverse(LDS,LDS+n);
int ans=1;
for(int i=0;i<n;i++)
ans=max(ans,2*min(LIS[i],LDS[i])-1);
printf("%d\n",ans);
}
}
2.解题思路:本题是一道需要求解LIS的题目,因为n的范围比较大,这里需要利用O(NlogN)的算法来求解。首先,求出从左往右的LIS和从右往左的LIS(即从左往右的LDS)。那么,最终只需要扫描一遍,答案为2*min(LIS[i],LDS[i])-1。因为如果LIS[i]有k个元素且LIS[i]<LDS[i],那么相应的LDS中一定可以找到k个下降的子序列。由于在i处的元素重复计算了一次,因此要-1。
3.代码:
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<list>
#include<complex>
#include<functional>
using namespace std;
#define me(s) memset(s,0,sizeof(s))
#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
typedef long long ll;
typedef pair <int,int> P;
const int N=10000+10;
int a
,LIS
,LDS
,buf
;
void getLIS(int*aa,int*bb,int n)
{
int k=0;
buf[k++]=aa[0];
bb[0]=1;
for(int i=1;i<n;i++)
if(aa[i]>buf[k-1])
{
buf[k++]=a[i];
bb[i]=k;
}
else
{
int*lb=lower_bound(buf,buf+k,aa[i]);
*lb=aa[i];
bb[i]=lb-buf+1;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
me(buf);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
getLIS(a,LIS,n);
reverse(a,a+n);
getLIS(a,LDS,n);
reverse(LDS,LDS+n);
int ans=1;
for(int i=0;i<n;i++)
ans=max(ans,2*min(LIS[i],LDS[i])-1);
printf("%d\n",ans);
}
}
相关文章推荐
- PB开发还有前途吗
- 最长上升子序列(LIS)(HDU 1025)
- DP-LIS( Longest Increasing Subsequenc)
- 链接文件lds
- 最长递增子序列(LIS)的两种实现
- hdu1267最少拦截系统
- deque list vector 区别
- HDU 1677 Nested Dolls
- HDU 1513 Palindrome
- nlogn的LIS(最长不**子序列)
- LIS 最长上升子序列问题 nlgn时间打印其中一个序列
- u-boot lds文件详解
- 多校联合练习赛1 Problem1005 Deque LIS+LDS 再加一系列优化
- 求数组中最长递增子序列(编程之美2.16)
- 最长上升子序列
- POJ-1631-Bridging signals-( 水LIS-O(nlogn) -DP)
- ZOJ 2319 Beautiful People
- 最长递增子序列
- 【算法】旋转数组最小值、零子数组、LCS、LIS、字符串编辑距离
- 动态规划系列【2】最长递增子序列LIS