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的复杂度叭