HDU 1003 Max Sum

题目大意:给出一段数组,然后让你求出最大的子串和,并记录这个最大的子串和的开始位置和结束的位置。

解题报告:动态规划题,用最大子串和。即假设现在要求的是数组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  #include<iostream>
 2  #include<stdio.h> 
 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<n;++i)
26              f[i].front=1;
27              f[0].date=0;
28              int biaoji=1;
29              for(int i=1;i<=n;++i) {
30                  if(f[i-1].date+a[i]<0 )
31                      biaoji=i+1;
32                  else
33                  f[i].front=biaoji;
34                  f[i].rear=i;
35                  f[i].date=ma(0,f[i-1].date+a[i]);
36              }
37              for(int i=2;i<=n;++i)
38              if(f[i].date>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  }
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3055228.html