题解

1 条题解

  • 1
    @ 2022-08-03 14:42:45
    #include<bits/stdc++.h>
    using namespace std;
    int n,a[1010],cnt,pos[1010],pos2[1010];
    int dp[1010];
    int main()
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i<=n; i++)
        {
            if(a[i]<=i)
            {
                pos[++cnt]=i-a[i];
                pos2[cnt]=i;
            }
        }
        dp[1]=1;
        for(int i=2; i<=cnt; i++)
        {
            dp[i]=1;
            for(int j=1; j<i; j++)
            {
                if(pos[j]<=pos[i]&&pos2[i]-pos2[j]-1>=pos[i]-pos[j])
                    dp[i]=max(dp[i],dp[j]+1);
            }
        }
        int ans=0;
        for(int i=1; i<=cnt; i++) ans=max(ans,dp[i]);
        printf("%d",ans);
    }
    /*先找出a[i]小于等于i的数的个数cnt,然后把它们的i-a[i]的值(需要删除i-a[i]个数后能够使得值与编号重合)存储,
    用这些值做一次特殊的最长不下降子序列(因为如果前面的i-a[i]大于后面某个i-a[i],那么这两个数不可能同时值与编
    号重合),做最长不下降子序列的的时候不光要考虑前面的项不能大于后面的项,还要考虑第i个数和第j个数之间的数够
    不够减(因为可能存在某个数需要前面总共删除x个数但中间并没有那么多数可删的情况),最后答案就是dp[cnt]。
    */
    
  • 1

信息

ID
1450
难度
7
分类
(无)
标签
递交数
2
已通过
1
通过率
50%
上传者