问题标题: 酷町堂:5097!30分!

0
0
已解决
李思远
李思远
中级守护
中级守护
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
int a[40005],f[40005],d,n;
int dfs(int i){
    int mx=-1;
    for(int j=1;j<=i-1;j++)
    {
        if(a[i]-a[j]==d)
        {
            mx=max(mx,dfs(j));
        }
        if(a[j]-a[i]==d)
        {
            mx=max(mx,dfs(j));
        }
    }
    if(mx==-1)
    {
        f[i]=1;
        return 1;
    }
    else
    {
        f[i]=mx+1;
        return mx+1;
    }
}
int main()
{
    memset(f,-1,sizeof(f));
    int ans=-1;
    cin>>n>>d;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        ans=max(ans,dfs(i));
    cout<<ans;
    return 0;
}

哪错了?大佬们帮帮忙~

李思远在2020-05-20 20:38:53追加了内容

80分,求大佬~

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
int a[40005],f[40005],d,n,x;
int dfs(int i){
    if(f[i]!=-1)return f[i];
    int mx=-1;
    for(int j=1;j<=i-1;j++)
    {
        if(x==0)
        {
            if(a[i]-a[j]==d)
            {
                x=1;
                mx=max(mx,dfs(j));
            }
            if(a[j]-a[i]==d)
            {
                x=2;
                mx=max(mx,dfs(j));
            }
        }
        else if(x==1&&a[i]-a[j]==d)
        {
            mx=max(mx,dfs(j));
        }
        else if(x==2&&a[j]-a[i]==d)
        {
            mx=max(mx,dfs(j));
        }
    }
    if(mx==-1)
    {
        f[i]=1;
        return 1;
    }
    else
    {
        f[i]=mx+1;
        return mx+1;
    }
}
int main()
{
    memset(f,-1,sizeof(f));
    int ans=-1;
    cin>>n>>d;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        ans=max(ans,dfs(i));
    cout<<ans;
    return 0;
}

 

李思远在2020-05-21 21:21:17追加了内容

偶已经做完了

#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
int a[40005],f[40005],d,n,x;
int dfs(int i){
    if(f[i]!=-1)return f[i];
    int mx=-1;
    for(int j=1;j<=i-1;j++)
    {
		if(a[j]+d==a[i])
			mx=max(mx,dfs(j));
    }
    if(mx==-1)
    {
        f[i]=1;
        return 1;
    }
    else
    {
        f[i]=mx+1;
        return mx+1;
    }
}
int main()
{
    memset(f,-1,sizeof(f));
    int ans=-1;
    cin>>n>>d;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        ans=max(ans,dfs(i));
    cout<<ans;
    return 0;
}

5098改一下第13行的符号即可

 


0
已采纳
黄子扬
黄子扬
初级天翼
初级天翼

WA三个点?TLE三个点?

黄子扬在2020-05-17 21:18:43追加了内容
if(a[i]-a[j]==d)
        {
            mx=max(mx,dfs(j));
        }
        if(a[j]-a[i]==d)
        {
            mx=max(mx,dfs(j));
        }

这两个判断的结果用两个数组分开存,就没有WA了

你的源代码的hack:

in:5 1 1 2 3 4 3
out:5

改完了后还会有三个TLE,快读?

黄子扬在2020-05-17 22:14:11追加了内容

当然,这题数据水,n方的做法O2就能过,但等比那题就不行了。。

正解是n log n或n的复杂度叭

我要回答