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\n",solve());

44     }

45     return 0;

46 }
View Code

 

 

 

你可能感兴趣的:(this)