895. 最长上升子序列 朴素版————易错!!!
作者:
cyuyu
,
2022-03-13 13:10:40
,
所有人可见
,
阅读 165
代码
#include<iostream>
using namespace std;
const int N=1100;
int f[N];
int a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
// f[1]=1;
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<=i-1;j++){
if(a[i]>a[j]){
f[i]=max(f[i],f[j]+1);
}
}
}
int res=-2e9;
for(int i=1;i<=n;i++){
res=max(res,f[i]);
}
cout<<res<<endl;
return 0;
}
错误代码
#include<iostream>
using namespace std;
const int N=1100;
int f[N];
int a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
f[1]=1;
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<=i-1;j++){
if(a[i]>a[j]){
f[i]=max(f[i],f[j]+1);
}
else
f[i]=f[j];//这里不对,因为f[i]代表当前最大的子序列数量,如果这个数比前边所有数都小那么
//他不能直接赋值为f[j],也不能赋值为f[i]=max(f[i],f[j]),因为后续的计算是根据这个数来的
//如果这样做了,后续就乱了,所以一定要注意f[i]是a[i]这个数的当前最大子序列的值!!!
//所以每一个f[i]在之前应该赋值为1,并且不是f[n]最大,所以下边还得有个循环来寻找max(f[i])
}
}
cout<<f[n]<<endl;
return 0;
}