记忆化搜索
2025-04-18 19:23:16
发布于:浙江
16阅读
0回复
0点赞
注意到,线性dp难以转移,而且会出现大量转移浪费。
考虑记忆化搜索,直接按照题意模拟即可。
数据略显凶残,需要卡常。
卡常:采用 _ 与
需要用快读哦!
: 实测:提交十次,能 八次
:
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned short
ll t[30003];
unordered_map<ll,ll> mp[30001];
ll n,d;
ll maxx;
ll in()
{
ll k=0;
char c=getchar_unlocked();
while(c<'0'||c>'9')
{
c=getchar_unlocked();
}
while(c>='0'&&c<='9')
{
k=(k<<1)+(k<<3)+(c^48);
c=getchar_unlocked();
}
return k;
}
ll bl;
ll dfs(ll x,ll l)
{
if(mp[x].count(l))
{
return mp[x][l];
}
ll pq=0;
if(x+l<=maxx)
{
bl=dfs(x+l,l)+t[x+l];
pq=bl;
}
if(x+l+1<=maxx)
{
bl=dfs(x+l+1,l+1)+t[x+l+1];
if(bl>pq)
pq=bl;
}
if(l-1>0)
{
if(x+l-1<=maxx)
{
bl=dfs(x+l-1,l-1)+t[x+l-1];
if(bl>pq)
pq=bl;
}
}
return mp[x][l]=pq;
}
int main()
{
n=in(),d=in();
ll x;
for(ll i=1;i<=n;++i)
{
x=in();
++t[x];
}
maxx=x;
cout<<dfs(d,d)+t[d];
return 0;
}
全部评论 1
%%%
2025-06-02 来自 广东
0
有帮助,赞一个