poj 1678 I Love this Game!

思路:这题和博弈论的关系不大,主要是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
",solve());
44     }
45     return 0;
46 }
View Code
原文地址:https://www.cnblogs.com/xin-hua/p/3317324.html