8 3890 2070 1550 3000 2990 1700 1580 650 0
6
无
最长上升(下降)子序列的关键就是将dp[i],定义为以a[i]结尾的最长上升(下降)子序列的长度。
求解上升或下降时,模板可不变,只改变输出即可。
这是我自己写的代码(已AC):
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#define maxn 1005
using namespace std;
int main()
{
int i,j,n,maxdp,leap,dp[maxn],a[maxn],res;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
memset(dp,0,sizeof(dp));
for(i=n;i>=1;--i){
scanf("%d",&a[i]);
}
dp[1]=1;res=0;
for(i=2;i<=n;++i){
leap=0;maxdp=0;
for(j=i-1;j>=1;--j){
if(a[i]>=a[j]){
if(dp[j]>maxdp)
maxdp=dp[j];
leap=1;
}
}
if(leap==0) maxdp=0;
dp[i]=maxdp+1;
res=max(res,dp[i]);
// cout<<dp[i]<<endl;
}
cout<<res<<endl;
}
return 0;
}
这是根据模板写的(已AC):
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<cmath>
#define maxn 1005
using namespace std;
int main()
{
int i,j,n,maxdp,leap,dp[maxn],a[maxn];
while(scanf("%d",&n)!=EOF){
if(n==0)break;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;++i){
scanf("%d",&a[i]);
}
int res=0;
for(i=1;i<=n;++i){
dp[i]=1;
for(j=1;j<i;++j){
if(a[j]>=a[i]){
dp[i]=max(dp[i],dp[j]+1);
}
}
res=max(res,dp[i]);
}
cout<<res<<endl;
}
return 0;
}