求数组中的最大子数组4

#include<iostream>
#define N 100
#include<ctime>
using namespace std;
typedef struct
{
 int d[N];
 int a[N][N];
 int x;
}A;
void set(A &shu, int x, int y)//x,y分别是行数和列数
{
 shu.x = x*y;
 srand((unsigned)time(NULL));
 for(int i = 1; i <= shu.x; i++)
 {
  shu.d[i] = rand() % 10;
  if(rand() % 2== 1)
   shu.d[i] = shu.d[i] * (-1);
 }//随机生成数组的数
for(int i = 1; i <= shu.x; i +=y)
{
 for(int j = i; j <= i + y - 2; j++)
 {
  shu.a[j][j+1] = 1;
  shu.a[j+1][j] = 1;
 }
} for(int i = 1+ y;i<shu.x;i+=y)
{
 for(int j = i; j <= i + x - 1; j++)
 {
  shu.a[j][j-y] = 1;
  shu.a[j-y][j] = 1;
 }
}//将随机生成的一维数组转换成二维的图的形式
}
void output(A shu)
{
 for(int i = 1; i <= shu.x; i++)
 {
  cout <<shu.d[i] ;
  if(shu.a[i][i + 1] == 1)
   cout << "  ";
  else
            cout <<endl;
 }
}
void bianli(A &shu, int v, int visit[], int&b, int&max, int x)
{
 visit[v] = 1;
 max+=shu.d[v];
 if(max>=b)
  b =max;
 int a = 0, bo = 0;
 for(int w = 1; w <= shu.x; w++)
 {
  for(int c = 1; c <= shu.x; c++)
  {
   if((visit[w] == 0) && (shu.a[c][w] == 1) && (visit[c] == 1))
   { 
    a = w;
    bo = 1;
    break;
   }
  }
  if(bo == 1) break;
 }
 for(int w = 1; w <= shu.x; w++)
 {
  for(int c = 1; c <= shu.x; c++)
  {
   if((visit[w] == 0) && (shu.a[c][w] == 1) && (visit[c] == 1))
   {
    if(shu.d[a]<shu.d[w])
     a=w;
   }
  }
 }
 if(b+shu.d[a]<0)
 {
  shu.a[v][a] = 0;
 }
 else
bianli(shu, a, visit, b, max, x);
}
//遍历
int NoVisit(int visit[], A shu)
{
 int k = 0, i;
 for(i = 1; i <= shu.x; i++)
 {
  if(visit[i] == 0)
  {
   k =i;
   break;
  }
 } return k;
}//判断图中没有visit的项
int main()
{
 cout << "Please input the row and the col:"<<endl;
 int x, y;
 cin >> x >>y;
 A shu;
 set(shu, x, y);
 output(shu);
 int v = 1, b[N] = { 0}, h = 0;
 for(int i = 1; i <= shu.x; i++)
 {
  if(shu.d[i]<0)
  {
   b[i] =shu.d[i];
  }
  else
       {
  int visit[N] = { 0};
  int max = 0;
  bianli(shu, i, visit, b[i], max, x);
  }
 }
 int max = b[1];
 for(int i = 2; i <= shu.x; i++)
 {
  if(b[i]>max) max =b[i];
 }
 cout << "The max array is:"<< max <<endl;
}

时间: 2024-08-07 16:39:39

求数组中的最大子数组4的相关文章

软件工程结对开发之求一个数组中连续最大子数组之和

一.团队成员: 檀威,陈志利 二.项目名: 求一个数组中连续最大子数组之和 三.我们的设计思路: 设sum[i]为以第i个元素结尾且和最大的连续子数组.对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且它们之和最大的连续子数组要么是以第i-1个元素结尾且它们之和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + arr[i], arr[i]).可以通过判断sum[i-1] + arr[i]是否大于arr[i]来做

3、软件工程结对开发之求一维数组中连续最大子数组之和并判断溢出

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 结果溢出之后能判断. 二.设计思想 在我们的前一个程序中,由于int类型rand()随机产生数范围是0~32767,所以产生的1000个数较小,不会产生溢出.但我们通过查资料得知int32最大数是2147

软件工程结对开发之求一个或者多个数组中连续最大子数组之和3

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 三.代码 四.截图 五.总结 六.工作合影

软件工程结对开发之求一维数组中连续最大子数组之和2

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 结果溢出之后能判断. 二.设计思想 在求最大连续子数组时同样用动态法,对于新增的要求,可以增大随机产生数的倍数,如果结果溢出则输出溢出提示字样,其中int类型rand()随机产生数范围是0~32767,i

软件工程结对开发之求二维数组中连续最大子数组之和2

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 先调用以前求二维最大连续子数组之和的maxSubArray函数求一个首尾不相邻的二维最大连续子数组之和,接着用将第k列各元素左移一列可以再求一个最大连续子数组之和 ,循环m次(因为原二维数组有m列)求得每个

5、软件工程结对开发之求一维数组中连续最大子数组之和

一.题目:返回一个二维整数数组中最大子数组的和.二.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 三.设计思想 这个实验是在前几次实验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,要把该数放在数组的最后边,这样循环遍历最后求出最大子数组的和. 四.源代码 1 #include <iostream.h> 2 int

返回一个二维整数数组中的最大子数组之和(环)

要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 根据前几次所做的关于一维及二维数组的思路,将其整合. 把二维数组转换成一维数组,再用求一维数组最大子数组和(环)的方式求解 1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 using namespac

Java 数组中寻找最大子数组

程序设计思想: 依次将数组划分开,先判断一个元素的单个数组大小,接下来两个,依次上升,最后将所得结果进行比较赋值,输出最大结果. 1 package ketangTest; 2 //张生辉,康治家 2017.3.20 3 public class Test { 4 public static void main(String args[]){ 5 int b[]={-7,9,-2,84}; 6 int a[]={-7,9,-2,84,-7,9,-2,84}; 7 int max,max2,max

一维数组中的最大子数组(环状)

精简版,没有输出下标. 在原基础上加上回溯和两个标记,还没进一步测试. #include<iostream> using namespace std; void main() { int i,j=0,k=0,n=5; int a[100]; int temp=0,sum=0; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) { if(temp>0) { temp+=a[i]; } else { temp=a[i]; if(