[关闭]
@994495jj 2017-09-11T02:08:05.000000Z 字数 994 阅读 771

hdu6199 gems gems gems(轮流取石子使差最大/小)

201709


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  8. #define sz(a) (int)a.size()
  9. #define de(a) cout<<#a<<" = "<<a<<endl
  10. #define dd(a) cout<<#a<<" = "<<a<<" "
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13. typedef vector<int> vi;
  14. //-----
  15. const int N=20001;
  16. const int M=160;
  17. int n;
  18. int sum[N],f[N][M][2];
  19. int main(){
  20. int T;scanf("%d",&T);
  21. while(T--) {
  22. ///
  23. scanf("%d",&n);
  24. ///init
  25. memset(f,0,sizeof(f));
  26. ///read
  27. rep(i,1,n+1) scanf("%d",&sum[n+1-i]);
  28. ///get sum
  29. rep(i,1,n+1) sum[i]=sum[i]+sum[i-1];
  30. ///solve
  31. rep(i,0,n+1) {
  32. for(int k=0;(1+k)*k/2<=(n-i)+2&&i>=k;++k) {
  33. if(k>=M) {de(i);de(k);}
  34. rep(x,0,2) {
  35. int r1=f[i-k][k][1-x];
  36. int t1=sum[i]-sum[i-k];
  37. int res=0;
  38. if(x) {
  39. res=r1-t1;
  40. } else {
  41. res=r1+t1;
  42. }
  43. if(i>=k+1) {
  44. int r2=f[i-(k+1)][k+1][1-x];
  45. int t2=sum[i]-sum[i-(k+1)];
  46. if(x) {
  47. res=min(res,r2-t2);
  48. } else {
  49. res=max(res,r2+t2);
  50. }
  51. }
  52. f[i][k][x]=res;
  53. }
  54. }
  55. }
  56. ///print
  57. printf("%d\n",f[n][1][0]);
  58. }
  59. return 0;
  60. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注