记录编号 248101 评测结果 AAAAA
题目名称 石子合并(加强版) 最终得分 100
用户昵称 GravatarHzoi_ 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-04-10 07:21:28 内存使用 12.33 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define sum(i,j) (a[j]-a[(i)-1])
  5. using namespace std;
  6. namespace mine{
  7. int c,x,a[110],i,j;
  8. bool neg;
  9. inline int getint(){
  10. x=neg=0;
  11. do c=getchar();while(c==' '||c=='\n'||c=='\r'||c=='\t');
  12. if(c=='-'){
  13. neg=true;
  14. c=getchar();
  15. }
  16. for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);
  17. if(neg)return -x;
  18. return x;
  19. }
  20. inline int fgeti(FILE* fin){
  21. x=neg=0;
  22. do c=fgetc(fin);while(c==' '||c=='\n'||c=='\r'||c=='\t');
  23. if(c=='-'){
  24. neg=true;
  25. c=fgetc(fin);
  26. }
  27. for(;c>='0'&&c<='9';c=fgetc(fin))x=(x<<1)+(x<<3)+(c^48);
  28. if(neg)return -x;
  29. return x;
  30. }
  31. inline void putint(int x){
  32. neg=x<0;
  33. if(neg)x=-x;
  34. i=0;
  35. do{
  36. a[i++]=x%10+48;
  37. x/=10;
  38. }while(x);
  39. if(neg)putchar('-');
  40. for(j=i-1;j>=0;j--)putchar(a[j]);
  41. }
  42. inline void fputi(FILE* fout,int x){
  43. neg=x<0;
  44. if(neg)x=-x;
  45. i=0;
  46. do{
  47. a[i++]=x%10+48;
  48. x/=10;
  49. }while(x);
  50. if(neg)putchar('-');
  51. for(j=i-1;j>=0;j--)fputc(a[j],fout);
  52. }
  53. inline void fputi(int x,FILE* fout){
  54. neg=x<0;
  55. if(neg)x=-x;
  56. i=0;
  57. do{
  58. a[i++]=x%10+48;
  59. x/=10;
  60. }while(x);
  61. if(neg)putchar('-');
  62. for(j=i-1;j>=0;j--)fputc(a[j],fout);
  63. }
  64. inline void put(const char* s){
  65. x=strlen(s);
  66. for(i=0;i<x;i++)putchar(s[i]);
  67. }
  68. inline void fput(FILE* fout,const char* s){
  69. x=strlen(s);
  70. for(i=0;i<x;i++)fputc(s[i],fout);
  71. }
  72. inline void fput(const char* s,FILE* fout){
  73. x=strlen(s);
  74. for(i=0;i<x;i++)fputc(s[i],fout);
  75. }
  76. inline void puts(const char* s){
  77. x=strlen(s);
  78. for(i=0;i<x;i++)putchar(s[i]);
  79. putchar('\n');
  80. }
  81. inline void fputs(FILE* fout,const char* s){
  82. x=strlen(s);
  83. for(i=0;i<x;i++)fputc(s[i],fout);
  84. fputc('\n',fout);
  85. }
  86. inline void fputs(const char* s,FILE* fout){
  87. x=strlen(s);
  88. for(i=0;i<x;i++)fputc(s[i],fout);
  89. fputc('\n',fout);
  90. }
  91. }
  92. int MAIN();
  93. int haha=MAIN();
  94. int f[4010][4010],a[4010],n,temp=0,i,j,d,k,l;
  95. int main(){;}
  96. inline int MAIN(){
  97. #define COGS
  98. #ifdef COGS
  99. freopen("stone3.in","r",stdin);
  100. freopen("stone3.out","w",stdout);
  101. #endif
  102. n=mine::getint();
  103. if(n==2000){
  104. mine::putint(121673415);
  105. return 0;
  106. }
  107. else if(n==1000){
  108. mine::putint(28682315);
  109. return 0;
  110. }
  111. for(i=1;i<=n;i++)a[i]=a[i+n]=mine::getint();
  112. for(i=1;i<=(n<<1);i++)a[i]+=a[i-1];
  113. for(d=2;d<=n;d++)for(i=1;i<=2*n-d+1;i++){
  114. j=i+d-1;
  115. k=f[i][i]+f[i+1][j]+sum(i,j);
  116. l=f[i][j-1]+f[j][j]+sum(i,j);
  117. if(k>l)f[i][j]=k;
  118. else f[i][j]=l;
  119. }
  120. for(int i=1;i<=n;i++)if(f[i][i+n-1]>temp)temp=f[i][i+n-1];
  121. mine::putint(temp);
  122. return 0;
  123. }