思路:这题和博弈论的关系不大,主要是DP。记忆化搜索即可!!!
取的数一定是大于0的,所以将负数去掉!!
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<vector> 6 #include<cstring> 7 #define inf 1e9 8 using namespace std; 9 int dp[10005],n,a[10005],l,r; 10 int dfs(int m) 11 { 12 if(dp[m]!=inf) return dp[m]; 13 int ans=inf; 14 for(int i=m+1;i<n;i++){ 15 if(a[i]-a[m]>=l&&a[i]-a[m]<=r) 16 ans=min(ans,a[m]-dfs(i)); 17 } 18 if(ans==inf) return dp[m]=a[m]; 19 return dp[m]=ans; 20 } 21 int solve() 22 { 23 int ans=-inf; 24 for(int i=0;i<n;i++){ 25 if(a[i]>=l&&a[i]<=r) 26 ans=max(ans,dfs(i)); 27 } 28 return ans==-inf?0:ans; 29 } 30 int main() 31 { 32 int i,j,q,k,t; 33 scanf("%d",&t); 34 while(t--){ 35 scanf("%d%d%d",&n,&l,&r); 36 for(i=j=0;i<n;i++){ 37 scanf("%d",&q); 38 if(q>0) a[j++]=q; 39 dp[i]=inf; 40 } 41 n=j; 42 sort(a,a+n); 43 printf("%d\n",solve()); 44 } 45 return 0; 46 }