题意:求一个循环队列的最大子段和 算法:首先当作不循环的,用dp方法求出最大子段和,然后求出第二个数以后的不循环的最小子段和,看前者和total-后者谁更大,即可 代码如下: #include <iostream> using namespace std; long long A; int t,n; int main() { scanf("%d",&t); int i; long long sum,tmp,summin,tmpmin,total; while (t--) { sum=0; total=0; summin=0; tmp=-10000000; tmpmin=10000000; scanf("%d",&n); for (i=0;i<n;i++) { scanf("%lld",&A); total+=A; if (i!=0) summin+=A; sum+=A; if (i!=0&&tmpmin>summin) tmpmin=summin; if (tmp<sum) tmp=sum; if (sum<0) sum=0; if (summin>0) summin=0; } printf("%lld/n",tmp>total-tmpmin?tmp:total-tmpmin); } return 0; }