POJ 2533 Longest Ordered Subsequence(dp LIS),pojsubsequence
Language:DefaultLongest Ordered Subsequence
| Time Limit: 2000MS |
|
Memory Limit: 65536K |
| Total Submissions: 33986 |
|
Accepted: 14892 |
Description 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. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).
Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.Input The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000Output Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.Sample Input 71 7 3 5 9 4 8 Sample Output 4 Source Northeastern Europe 2002, Far-Eastern Subregion |
[Submit] [Go Back] [Status] [Discuss]
求最長遞增子序列
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define eps 1e-8using namespace std;#define N 1005int dp[N],n,a[N];int main(){int i,j;while(~scanf("%d",&n)){for(i=1;i<=n;i++)scanf("%d",&a[i]);int ans=1;dp[1]=1;int temp;for(i=2;i<=n;i++){temp=0;for(j=1;j<i;j++)if(a[j]<a[i]&&temp<=dp[j]) temp=dp[j]; dp[i]=temp+1;if(dp[i]>ans)ans=dp[i];} printf("%d\n",ans);} return 0;}
Longest Ordered Subsequence問題描述,到底是什?誰可以解釋下?
在一個數列中間“最長的有序子數列”
比如在數列(1, 7, 3, 5, 9, 4, 8) 中有諸如(1,7),(3,4,8)等等的有序子數列,但是最長的有序子數列只有一個,那就是(1, 3, 5, 8)
要注意有序子數列是遞增關係,所以有序子數列中前一個數字必須比後一個小!
參考資料:poj.org/problem?id=2533
ACM題的演算法
最長子序列的問題。。。。用動態劃分吧。。
代碼如下:
#include <stdio.h>
#include <malloc.h>
void maxlen(int L[],int n )
{
int *B=(int *)malloc(sizeof(int)*(n+1));
B[0]=-10000;
B[1]=L[0];
int maxlen = 1;
int p,r,m;
for(int i = 1;i<n;i++)
{
p=0;r=maxlen;
while(p<=r)
{
m = (p+r)/2;
if(B[m]<L[i]) p = m+1;
else r = m-1;
}
B[p] = L[i];
if(p>maxlen) maxlen++;
}
free(B);
printf("%d\n",maxlen);
}
int main()
{
int num,*a;
scanf("%d",&num);
a=(int *)malloc(sizeof(int)*(num));
for(int i=0;i<num;i++)
scanf("%d",(a+i));
maxlen(a,num);
free(a);
return 0;
}