3637 - 最长上升子序列长度0
时间限制 : 1 秒
内存限制 : 128 MB
一个数的序列 bi,当 b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ...,
aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里 1 <= i1 < i2 < ... <iK <= N。比如,对于序列(1, 7,
3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。
这些子序列中最长的长度是 4,比如子序列(1, 3, 5, 8).
<span style="line-height:1.5;">你的任务,就是对于给定的序列,求出最长上升子序列的长度。</span>
题目输入
输入的第一行是序列的长度 N (1 <= N <= 1000)。第二行给出序列中的 N个整数,这些整数的取值范围都在 0到
10000。
题目输出
最长上升子序列的长度。
输入/输出样例
输入格式
7 1 7 3 5 9 4 8
输出格式
4
C语言解答
#include <stdio.h> int dp[1001]; int a[1001]; int Max(int a,int b) { if(a>b) return a; else return b; } int main() { int n,i,max,index,j,b; while(scanf("%d",&n)!=EOF) { max=-99999; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { dp[i]=1; for(j=0;j<=i-1;j++) { if(a[j]<a[i]&&dp[i]<dp[j]+1) dp[i]=Max(1,dp[j]+1); } if(max<dp[i]) max=dp[i]; } printf("%d\n",max); } return 0; }
C++解答
#include <bits/stdc++.h> using namespace std; int main() { int n; //freopen("F:\\QQDownlaod\\Laputa\\2015.3.23\\0320\\acm\\as\\test.in","r",stdin); while(~scanf("%d",&n)){ int num[1005]; for (int i=0;i<n;i++) scanf("%d",&num[i]); int d[1005]; memset(d,0,sizeof(d)); d[0]=1; for (int i=1;i<n;i++){ int ans=0; for (int s=0;s<i;s++){ if (num[i]>num[s]) ans=max(ans,d[s]); } d[i]=ans+1; } int ans=0; for (int i=0;i<n;i++){ ans=max(ans,d[i]); } printf("%d\n",ans); } return 0; }