Dp[I] [J]? =? (The number of the gems on islandI)? +?Max(Dp[I? +?J? -? 1] [J? -? 1],?Dp[I? +?J] [J],?Dp[I? +?J? +? 1] [J? +? 1]), ifI? M,?J? ≥? 2This solution is unfeasible in terms of both time and memory. However, the following observation makes it an Accepted solution: there are only 491 valuesJThat we have to consider, which areD? -? 245 ,?D? -? 244 ,?D? -? 243 ,?...,?D? +? 244 andD? +? 245.
Why? First, let us find the upper boundJ. Suppose Mr. Kitayuta always performs"L? +? 1 "jump (L: The length of the previous jump). Then, he will reach the end of the islands before he performs a jump of lengthD? +? 246, because
D? +? (D? +? 1 )? +? (D? +? 2 )? + ?...? +? (D? +? (245 )? ≥? 1? +? 2? + ?...? +? 245? =? 245. (245? +? 1 )? /? 2? =? 30135?>? 30000. Thus, he will never be able to perform a jump of length.D? +? 246 or longer.
Next, let us consider the lower boundJIn a similar way. IfD? ≤? 246, then obviously he will not be able to perform a jump of lengthD? -? 246 or shorter, because the length of a jump must be positive. Suppose Mr. Kitayuta always performs"L? -? 1 "jump, whereD? ≥? 247. Then, again he will reach the end of the islands before he performs a jump of lengthD? -? 246, because
D? +? (D? -? 1 )? +? (D? -? 2 )? + ?...? +? (D? -? (245 )? ≥? 245? +? 244? + ?...? +? 1? =? 245. (245? +? 1 )? /? 2? =? 30135?>? 30000. Thus, he will never be able to perform a jump of length.D? -? 246 or shorter.
Therefore, we have obtained a working solution: similar toO(M2) one, but we will only consider the valueJBetweenD? -? 245 andD? +? 245. The time and memory complexity of this solution will beO(M1.5), since the value "245" is slightly larger. <喎?http: www.bkjia.com kf ware vc " target="_blank" class="keylink"> VcD4KPHA + Signature = "normal" two dimen1_array with a offset like this: dp[i][j - offset]. The time limit is set tight in order to fail most of naive solutions with search using std: map or something, so using hash maps (unordered_map) will be risky although the complexity will be the same as the described solution.
[End]
#include
#include
#include
#include#include
#include
#include
#include
#include
#include
#include
using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i
=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define MAXN (30000+10)#define MAXD (30000+10)#define M (30001)#define MP(a,b) make_pair(a,b) #define MAX_d_change (250+10)#define C (250)long long mul(long long a,long long b){return (a*b)%F;}long long add(long long a,long long b){return (a+b)%F;}long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}typedef long long ll;int n,d,a[MAXN]={0},s[MAXN]={0},f[MAXN][MAX_d_change*2]={0};int main(){//freopen("Treasure.in","r",stdin);//freopen(".out","w",stdout);cin>>n>>d;For(i,n){int p;scanf("%d",&p);a[p]++;}For(i,M) s[i]=s[i-1]+a[i];int ans=0;memset(f,-1,sizeof(f));ans=f[d][C]=a[d];Fork(i,d,M){Rep(j,2*C+1)if (f[i][j]>=0){int dis=j-C+d;if (dis>0&&i+dis<=M) {f[i+dis][j]=max(f[i+dis][j],f[i][j]+a[i+dis]);ans=max(ans,f[i+dis][j]);}if (i+dis+1<=M) {f[i+dis+1][j+1]=max(f[i+dis+1][j+1],f[i][j]+a[i+dis+1]);ans=max(ans,f[i+dis+1][j+1]);}if (dis-1>0&&i+dis-1<=M) {f[i+dis-1][j-1]=max(f[i+dis-1][j-1],f[i][j]+a[i+dis-1]);ans=max(ans,f[i+dis-1][j-1]);}}}cout<