确定最大子序列和的位置 分治递归法实现 是确定位置啊,大家进来讨论吧
求最大子序列和,并确定其位置,高效算法的话DP和分治了但是还要确定子序列的位置,即第几个元素到第几个元素
我用DP求出和还有位置,用分治也求出了和,但是求不出位置,一般情况可以确定,但是一些特殊情况就错了
先贴分治求最大子序列和的代码
程序代码:
//最大连续和子序列 //用分治递归法来求 #include <stdio.h> #include <string.h> int a[100010]; int k,j; int flag; int SUM(int x ,int y) { int sum1,sum2,max; int m; int temp,L,R,i; if(y-x==1) {p=q=x; return a[x]; } m=x+(y-x)/2; sum1=SUM(x,m); sum2=SUM(m,y); if(sum1>=sum2) max=sum1; else max=sum2; temp=0;L=a[m-1];k=m-1; //p3是用于记录子序列的头 for(i=m-1; i>=x; i--) { temp+=a[i]; if(temp>=L) L=temp; } temp=0;R=a[m];j=m; //q3是用于记录子序列的尾 for(i=m; i<y; i++) { temp+=a[i]; if(temp>=R) R=temp; j=i; } if(max>(L+R)) return max; else return (L+R); } int main() { int n; int i; int max; int t,T; scanf("%d",&T); for(t=1; t<=T; t++) { scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); max=SUM(1,n+1); printf("Case %d:\n",t); printf("%d %d %d\n",max,p,q); if(t!=T) printf("\n"); } return 0; }