zoukankan      html  css  js  c++  java
  • 【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ

    题目描述:

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

    输入:

    输入有多组数据,每组测试数据包括两行。

    第一行为一个整数n(0<=n<=100000),n=0,输入结束。接下去的一行包含n个整数(我们保证所有整数属于[-1000,1000])

    输出:

    对应每个测试案例,需要输出3个整数单独一行,分别表示连续子向量的最大和、该子向量的第一个元素的下标和最后一个元素的下标。若是存在多个子向量,则输出起始元素下标最小的那个。

    样例输入:

    3
    -1 -3 -2
    5
    -8 3 2 0 5
    8
    6 -3 -2 7 -15 1 2 2
    0

    样例输出:
    

    -1 0 0
    10 1 4
    8 0 3
    【解题思路】这应该是一个非常经典的问题了,看到这种最优化问题,而且各结果之间具有一定的联系的题型,第一反应就是dp问题,因为一个数我们能确定,两个数的话我们可以根据一个数确定,同理第三个数出现后我们能根据前面的数确定。用一个数组记录到当前元素为止的最大和,并记录其起始元素编号。

    AC code:

    #include <cstdio>
    #include <vector>
    using namespace std;
     
    int main()
    {
      int n;
      while(scanf("%d",&n) && n)
      {
        vector<int> sum(n),idx(n);
        int tt,allsum,reidx,endidx;
        scanf("%d",&tt);
        sum[0]=tt;
        idx[0]=0;
        for(int i=1;i<n;++i)
        {
          scanf("%d",&tt);
          if(sum[i-1]<0)
          {
            sum[i]=tt;
            idx[i]=i;
          }else
          {
            sum[i]=sum[i-1]+tt;
            idx[i]=idx[i-1];
          }
        }
        allsum=sum[0];
        reidx=0;
        endidx=0;
        for(int i=1;i<n;++i)
        {
          if(sum[i]>allsum)
          {
            allsum=sum[i];
            reidx=idx[i];
            endidx=i;
          }
        }
        printf("%d %d %d
    ",allsum,reidx,endidx);
      }
      return 0;
    }
    /**************************************************************
        Problem: 1372
        User: huo_yao
        Language: C++
        Result: Accepted
        Time:450 ms
        Memory:1836 kb
    ****************************************************************/
    题目链接:http://ac.jobdu.com/problem.php?pid=1372

    九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248890.html
Copyright © 2011-2022 走看看