1 条题解

  • 0
    @ 2024-6-11 19:45:06

    f[i]f[i] 为以 a[i]a[i] 为结尾LIS的长度,j<ia[j]<a[i]\forall j<i\wedge a[j]<a[i],我们就有这个转移:

    f[i]=max(f[i],f[j])f[i]=max(f[i],f[j])

    f[i]f[i] 初始为 11,因为最坏情况(即 j<i\forall j<i 都有 a[j]a[i]a[j]\ge a[i])下以 a[i]a[i] 为结尾的LIS长度就为 11

    但最后的答案并不一定为 a[n]a[n],如这组数据:

    2 3 4 5 6 22\ 3\ 4\ 5\ 6\ 2

    很明显答案为 55,但 f[n]f[n]11 不是最优答案。正确答案应为 f[1]f[n]f[1]\sim f[n] 的最大值。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5005,INF=0x3f3f3f3f; 
    int n,a[N],f[N],ans=-INF;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    		scanf("%d",&a[i]);
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<i;j++)
    			if(a[j]<a[i])
    				f[i]=max(f[i],f[j]);
    		ans=max(ans,++f[i]);
    	}
    	printf("%d",ans);
    	return 0;
    }
    

    需要注意不能在枚举 jj 之前就将 f[i]f[i] 设为 11

    • 1

    信息

    ID
    793
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    164
    已通过
    73
    上传者