A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Alan_Kwan 中级黑马   /  2014-6-22 22:49  /  1648 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Alan_Kwan 于 2014-6-22 22:57 编辑
  1. int [] arr = {4, -3, 5, -2, -1, 2, 6, -2};
复制代码

求它最大子序列的和,即它的子序列中和为最大的那个序列的和。

5 个回复

倒序浏览
是不是大于零的数相加就是它的最大子序列。这样的话就很简单了。
回复 使用道具 举报
木华 发表于 2014-6-22 23:04
是不是大于零的数相加就是它的最大子序列。这样的话就很简单了。

序列是有序的队列。子序列就是指比如{4,-3,5},而{4,5}不是。
回复 使用道具 举报
完全看不懂是什么意思
回复 使用道具 举报
class A
{
        public static void main(String[] args)
        {
       
                int [] arr = {4, -3, 5, -2, -1, 2, 6, -2};;
                System.out.println(max_sub(arr,arr.length));
        }
        public static int max_sub(int a[],int size)
        {
                 int i,j,v,max=a[0];
                 for(i=0;i<size;i++)
                 {
                          v=0;
                          for(j=i;j<size;j++)
                          {
                                   v=v+a[j];
                                   if(v>max)
                                                max=v;
                          }
                 }
                 return max;
        }
}
穷举所有子序列   最大子序列和是11
回复 使用道具 举报
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 int[] arr = { 4, -3, 5, -2, -1, 2, 6, -2 };
  4.                
  5.                 //定义一个变量接受最后的最大值
  6.                 int big = arr[0];
  7.                 //定义为数组中任意一个元素,如果定义0,在数组都为负数情况下会计算错误
  8.                
  9.                 //外围for循环取得某一子序列的开始位置,内层for循环取得任意子序列的结尾位置
  10.                 for (int i = 0; i < arr.length; i++) {
  11.                         for (int j = i; j < arr.length; j++) {
  12.                                 if (sum(arr, i, j) > big) {//如果某个子序列和大于big,将该值赋给big
  13.                                         big = sum(arr, i, j);
  14.                                 }
  15.                         }
  16.                 }

  17.                 System.out.println(big);//打印输出最后的big值
  18.         }

  19.        
  20.         //定义一个函数,计算出给出数组中从i角标开始到角标结束之间元素的和
  21.         public static int sum(int[] arr, int i, int j) {
  22.                 int sum = 0;
  23.                 for (int k = i; k <= j; k++) {
  24.                         sum += arr[k];
  25.                 }
  26.                 return sum;//返回计算的结果
  27.         }
  28. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马