• 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  }
  • 相关阅读:
    ASP.NET MVC 3: Razor中的@:和语法
    如何设置VS的代码智能提示
    七次
    不知不觉
    一切一切
    什么是喜欢
    Oracle的substr函数简单用法与substring区别
    前端必读:浏览器内部工作原理(转载)
    sublime text 插件安装 Mac版的
    一个随机上翻的小效果
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3055228.html
Copyright © 2020-2023  润新知