【问题描述】
定义“子序列”为从序列中去掉任意个(可能全都去掉,可能一个都没去掉)元素后的序列。
给定一个整数序列,求它们的最长严格单调递增子序列的长度。
【输入格式】
第一行,一个整数N。
第二行, N个整数k表示序列。
【输出格式】
最长严格单调递增子序列的长度。
【样例输入】
7
2 1 4 3 1 5 6
【样例输出】
4
【时间限制】 【空间限制】
1s 1GB
数据规模
1<=N,k<=1000
说明
样例输入的最长上升子序列可以为2 4 5 6,也可以为1 4 5 6,或者1 3 5 6。
但是它们长度都是4。
懒得用 LATEX (
为什么这两份代码有什么不同点啊,为什么一个用数组 定义 ={1}
和在后面的 for =1
有什么区别啊。。。
这个是老师的代码(就是 for =1
的那种,马蜂有点奇怪()
#include <bits/stdc++.h>
using namespace std;
int N, a[1003], dp[1003];
int main()
{
cin >> N;
for (int i=1; i<=N; i++)
{ dp[i]=1;//不同点
cin >> a[i];}
for(int x = 2; x <= N;x++)
for(int i = 1; i <= x; i++)
if(a[i]<a[x])
dp[x]=max(dp[x],dp[i]+1);
cout << dp[N];
}
我的代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,a[10001],dp[10001]={1};//不同点
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int x=2;x<=n;x++){
for(int i=1;i<=x;i++){
if(a[x]>a[i]){
dp[x]=max(dp[x],dp[i]+1);
}
}
}
cout<<dp[n];
return 0;
}