Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:DP附代码。。[这么说肯定是错的]In Reply To:DP附代码。。 Posted by:lulyon at 2011-03-14 00:41:35 > 从两端分别求以i为尾的最大连续子段和。然后把两端子段和相加求其最大值。。 > > #include<iostream> > using namespace std; > > int a[50010]; > int b[50010]; > int c[50010]; > > int main(){ > int n,t; > scanf("%d",&t); > while(t--){ > scanf("%d",&n); > for(int i=1; i<=n; ++i){ > scanf("%d",a+i); > } > > for(int i=1; i<=n; ++i){ > if(i==1){ > b[i]=a[i]; > } > else{ > if(b[i-1]>0){ > b[i] = a[i]+b[i-1]; > } > else{ > b[i]=a[i]; > } > } > } > > for(int i=2;i<=n; ++i){ > if(b[i]<b[i-1])b[i]=b[i-1]; > } > > for(int i=n; i>=1; --i){ > if(i==n)c[i]=a[i]; > else{ > if(c[i+1]>0){ > c[i]=c[i+1]+a[i]; > } > else{ > c[i]=a[i]; > } > } > } > > for(int i=n-1; i>=1; --i){ > if(c[i]<c[i+1])c[i]=c[i+1]; > } > > int max=b[1]+c[2]; > for(int i=2; i+1<=n; ++i){ > if(max<b[i]+c[i+1])max=b[i]+c[i+1]; > } > printf("%d\n",max); > } > return 0; > } > 代码要这么解释的话肯定有问题,可能会重复计算中间的公共部分, 正确的解释应该是 b[i]表示i为尾巴的最大连续和,c[i]表示i为头部的最大连续和, 第2次处理后 b[i]表示前i个元素的最大连续和,c[i]表示i~n元素的最大连续和 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator