1. 程式人生 > >洛谷 P1430 序列取數

洛谷 P1430 序列取數

who class direct 得到 functions mes == min switch

如果按照http://www.cnblogs.com/hehe54321/p/loj-1031.html的$O(n^3)$做法去做的話是會T掉的,但是實際上那個做法有優化的空間。

所有操作可以分解為由兩步組成的操作:第一步是在數列的某一端取一個數並加到自己的得分上,第二步是把下一步操作的權利給自己或對方。如果這次操作的前一次是對方的操作,那麽在左端或右端取數沒有限制;如果這次操作的前一次是自己的操作,那麽必須與上一次在相同的一端操作。

令ans[l][r][0/1/2]表示l到r的子序列,上一次操作是(0->對方取)或(1->自己取左端)或(2->自己取右端),先取者的最高得分。則可以得到狀態轉移方程。復雜度$O(n^2)$。

(枚舉狀態要按照一定的順序)

這題卡常!

 1 #pragma GCC diagnostic error "-std=c++11"
 2 #pragma GCC target("avx")
 3 #pragma GCC optimize(3)
 4 #pragma GCC optimize("Ofast")
 5 #pragma GCC optimize("inline")
 6 #pragma GCC optimize("-fgcse")
 7 #pragma GCC optimize("-fgcse-lm")
 8 #pragma GCC optimize("-fipa-sra")
 9
#pragma GCC optimize("-ftree-pre") 10 #pragma GCC optimize("-ftree-vrp") 11 #pragma GCC optimize("-fpeephole2") 12 #pragma GCC optimize("-ffast-math") 13 #pragma GCC optimize("-fsched-spec") 14 #pragma GCC optimize("unroll-loops") 15 #pragma GCC optimize("-falign-jumps") 16 #pragma GCC optimize("-falign-loops") 17
#pragma GCC optimize("-falign-labels") 18 #pragma GCC optimize("-fdevirtualize") 19 #pragma GCC optimize("-fcaller-saves") 20 #pragma GCC optimize("-fcrossjumping") 21 #pragma GCC optimize("-fthread-jumps") 22 #pragma GCC optimize("-funroll-loops") 23 #pragma GCC optimize("-fwhole-program") 24 #pragma GCC optimize("-freorder-blocks") 25 #pragma GCC optimize("-fschedule-insns") 26 #pragma GCC optimize("inline-functions") 27 #pragma GCC optimize("-ftree-tail-merge") 28 #pragma GCC optimize("-fschedule-insns2") 29 #pragma GCC optimize("-fstrict-aliasing") 30 #pragma GCC optimize("-fstrict-overflow") 31 #pragma GCC optimize("-falign-functions") 32 #pragma GCC optimize("-fcse-skip-blocks") 33 #pragma GCC optimize("-fcse-follow-jumps") 34 #pragma GCC optimize("-fsched-interblock") 35 #pragma GCC optimize("-fpartial-inlining") 36 #pragma GCC optimize("no-stack-protector") 37 #pragma GCC optimize("-freorder-functions") 38 #pragma GCC optimize("-findirect-inlining") 39 #pragma GCC optimize("-fhoist-adjacent-loads") 40 #pragma GCC optimize("-frerun-cse-after-loop") 41 #pragma GCC optimize("inline-small-functions") 42 #pragma GCC optimize("-finline-small-functions") 43 #pragma GCC optimize("-ftree-switch-conversion") 44 #pragma GCC optimize("-foptimize-sibling-calls") 45 #pragma GCC optimize("-fexpensive-optimizations") 46 #pragma GCC optimize("-funsafe-loop-optimizations") 47 #pragma GCC optimize("inline-functions-called-once") 48 #pragma GCC optimize("-fdelete-null-pointer-checks") 49 #include<cstdio> 50 #include<cstring> 51 #include<algorithm> 52 using namespace std; 53 int sum[1010],ans[1010][1010][3],a[1010],T,n; 54 inline int read() { 55 int x=0,f=1;char ch=getchar(); 56 while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();} 57 while(ch>=0&&ch<=9){x*=10;x+=(ch-0);ch=getchar();} 58 return x*f; 59 } 60 inline void write(int x) { 61 if(x<0) putchar(-),x=-x; 62 if(x>9) write(x/10); 63 putchar(x%10+0); 64 } 65 int main() 66 { 67 register int i,l; 68 int r; 69 T=read(); 70 while(T--) 71 { 72 memset(ans,0,sizeof(ans)); 73 n=read(); 74 for(i=1;i<=n;++i) 75 a[i]=read(); 76 for(i=1;i<=n;++i) 77 sum[i]=sum[i-1]+a[i]; 78 for(i=1;i<=n;++i) 79 ans[i][i][0]=ans[i][i][1]=ans[i][i][2]=a[i]; 80 for(i=2;i<=n;++i) 81 for(l=1;l<=n-i+1;++l) 82 { 83 r=l+i-1; 84 ans[l][r][0]=max(sum[r]-sum[l-1]-min(ans[l+1][r][0],ans[l][r-1][0]),max(a[l]+ans[l+1][r][1],a[r]+ans[l][r-1][2])); 85 ans[l][r][1]=max(sum[r]-sum[l-1]-ans[l+1][r][0],a[l]+ans[l+1][r][1]); 86 ans[l][r][2]=max(sum[r]-sum[l-1]-ans[l][r-1][0],a[r]+ans[l][r-1][2]); 87 } 88 write(ans[1][n][0]);putchar(\n); 89 } 90 return 0; 91 }

洛谷 P1430 序列取數