最大上升子序列
2013-09-07 12:05
302 查看
O(n^2)的算法:
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0x1fffffff;
const int MAXN = 1000;
int a[1010];
int dp[1010];
int n;
int main()
{
while(cin >> n && n)
{
for(int i = 0 ; i < n ; i++)
scanf("%d",&a[i]);
fill(dp,dp+n,1);
int maxc = -1;
for(int i = 0 ; i < n ; i++)
{
for(int j = i ; j >= 0 ; j--)
if(a[j] < a[i] && dp[j]+1 > dp[i])
dp[i] = dp[j]+1;
maxc = max(maxc,dp[i]);
}
cout << maxc << endl;
}
return 0;
}
O(nlog(n))的算法(C++):
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0xfffffff;
int a[100000+10];
int dp[100000+10];
int n;
int main()
{
cin >> n;
int lis=0;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
int p = lower_bound(dp,dp+lis,a[i])-dp; //lower_bound获取一个有序数列中能插入a[i]的迭代器,最大时则插入末尾
dp[p]=a[i]; //覆盖原数,使子序列潜力更大,如1,3,6;插入2时,会把3取代掉,变成1,2,6
if(p == lis) //p最大了,子序列size增大
lis++;
}
cout << lis << endl; //lis是最大上升子序列的长度,dp内存着其中一个最大上升子序列
return 0;
}
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0x1fffffff;
const int MAXN = 1000;
int a[1010];
int dp[1010];
int n;
int main()
{
while(cin >> n && n)
{
for(int i = 0 ; i < n ; i++)
scanf("%d",&a[i]);
fill(dp,dp+n,1);
int maxc = -1;
for(int i = 0 ; i < n ; i++)
{
for(int j = i ; j >= 0 ; j--)
if(a[j] < a[i] && dp[j]+1 > dp[i])
dp[i] = dp[j]+1;
maxc = max(maxc,dp[i]);
}
cout << maxc << endl;
}
return 0;
}
O(nlog(n))的算法(C++):
#include "iostream"
#include "cstring"
#include "algorithm"
#include "cmath"
#include "cstdio"
#include "sstream"
#include "queue"
#include "vector"
#include "string"
#include "stack"
#include "cstdlib"
#include "deque"
#include "fstream"
#include "map"
using namespace std;
typedef long long LL;
const int INF = 0xfffffff;
int a[100000+10];
int dp[100000+10];
int n;
int main()
{
cin >> n;
int lis=0;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
int p = lower_bound(dp,dp+lis,a[i])-dp; //lower_bound获取一个有序数列中能插入a[i]的迭代器,最大时则插入末尾
dp[p]=a[i]; //覆盖原数,使子序列潜力更大,如1,3,6;插入2时,会把3取代掉,变成1,2,6
if(p == lis) //p最大了,子序列size增大
lis++;
}
cout << lis << endl; //lis是最大上升子序列的长度,dp内存着其中一个最大上升子序列
return 0;
}
相关文章推荐
- hdu 1087 Super Jumping! Jumping! Jumping! 最大上升子序列。模板题
- (hdu step 3.2.3)Super Jumping! Jumping! Jumping!(DP:求最长上升子序列的最大和)
- 题目1480:最大上升子序列和:动态规划
- HDU 3998 Sequence (最长上升子序列+最大流)
- 题目1480:最大上升子序列和
- L2-014 列车调度(寻找最大上升子序列)
- hdu 1087 Super Jumping! Jumping! Jumping! (最大 上升子序列 线性 dp)
- 最长公共子序列、最长上升子序列、最大子串和
- hdu 1160 FatMouse's Speed(最大上升子序列dp)
- hdu1003 Max sum&hdu1231 最大连续上升子序列
- ACM-动态规划13-最大上升子序列和
- 动态规划:最大上升子序列和
- Bishops Alliance—— 最大上升子序列
- Codeforces 629 D Finals in arithmetic(最大上升子序列和,O(nlogn)、线段树/树状数组)
- 最大上升子序列和
- 最长上升子序列&最大上升子序列和
- hdu 1087 Super Jumping! Jumping! Jumping!(最大上升子序列之和)
- 动态规划―最大上升子序列和
- 题目1480:最大上升子序列和
- HDU 1087 Super Jumping! Jumping! Jumping! (线性dp 最大上升子序列)