题目大意:给出一段数组,然后让你求出最大的子串和,并记录这个最大的子串和的开始位置和结束的位置。
解题报告:动态规划题,用最大子串和。即假设现在要求的是数组a[]的最大子串和,先定义一个f[]数组,首先将f[]数组初始化,判断a[1]是否大于0,若大于等于0,
则f[1]=a[1],若a[1]<=0,则f[1]=0,接下来用递归了,递归方程为f[i]=(f[i-1]+a[i])>0? f[i-1]+a[i]:0,递归完了之后再求出f[]数组里面的最大值,就是要求的最大子串和。然后就是求最大子串和的位置的问题,这个只要当判断到了a[i]小于0的时候就把当前的串的位置记录在另一个结构体里面,也可以直接把f[]数组和直接定义成结构体。
View Code
1 #include2 #include 3 using namespace std; 4 int T,a[1000010]; 5 struct fun { 6 int date; 7 int front,rear; 8 }f[1000010]; 9 int ma(int x,int y) {10 return (x>y? x:y);11 }12 int main() {13 scanf("%d",&T);14 for(int l=1;l<=T;++l) {15 int n;16 scanf("%d",&n);17 for(int i=1;i<=n;++i)18 scanf("%d",&a[i]);19 int k=0;20 for(int i=1;i<=n;++i)21 if(a[i]>0)22 k=1;23 int max=1;24 if(k){25 for(int i=0;i f[max].date) {39 max=i;40 f[max].rear=max;41 }42 }43 else if(k==0) {44 int min=1;45 for(int i=2;i<=n;++i)46 if(a[i]>a[min])47 min=i;48 max=min;49 f[max].date=a[min];50 f[max].front=min;51 f[max].rear=min;52 }53 printf("Case %d:\n%d %d %d\n",l,f[max].date,f[max].front,f[max].rear);54 if(l!=T)55 printf("\n");56 }57 return 0;58 }