问题标题: 酷町堂:3920

0
1
已解决
吕牧原
吕牧原
高级守护
高级守护

#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int a[100001],f[100001];
int main()
{
    int n;
    cin>>n;
    int k;
    cin>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        f[i]=1;
        for(int j=1;j<i;j++)
        {
            if(a[i]-k==a[j])
            {
                f[i]=max(f[j]+1,f[i]);
            }
        }
    }
    int maxn=0;
    for(int i=1;i<=n;i++)
    {
        if(f[i]>=maxn)
        {
            maxn=f[i];
        }
    }
    cout<<maxn;
    return 0;
}

怎么减少时间复杂度?

求大佬!!@王子健!!

吕牧原在2020-07-28 16:46:31追加了内容

不许发代码!!只要动态规划的思路


0
已采纳
王子健
王子健
初级天翼
初级天翼

我也不知道,我也是TLE80分,不知道怎么优化:

可以问一下老师,还有加我QQ:1708262261,考试互帮互助

0
贾志骜
贾志骜
新手光能
新手光能

2位可曾听过桶数组 @王子建 

0
包涵宇
包涵宇
中级天翼
中级天翼

好吧,这的确是动态规划,但。。。

动态转移方程:

if(a[i]-k+100000>=0&&a[i]-k+100000<=200000)f[i]=max(f[i],f[b[a[i]-k+100000]]+1);
ans=max(ans,f[i]);

剩下的自己想

PS:只有一重循环哦~

要带码加QQ:3088515022

WANGCAINA!!!

我要回答