1. 程式人生 > >軟體工程課後作業5:返回一個二維整數陣列中最大子陣列的和

軟體工程課後作業5:返回一個二維整數陣列中最大子陣列的和

要求:

輸入一個二維的整形陣列,數組裡有正數也有負數。

陣列中連續的一個或多個整陣列成一個二維子陣列,每個子陣列都有一個和。

求所有子陣列的和的最大值。——摘要

#include<iostream>
#include <stdio.h> 
using namespace std;
FILE *fpRead=fopen("input.txt","r");
char cgetchar(){
    char c;
    fscanf(fpRead,"%c",&c);
    return c;
 }
 int getnum(){
     char c;
     int num = 0, fuhao = 1;
     while((c = cgetchar()) != EOF && ('0' > c || '9' < c) && c != '-');
     if(c == '-') fuhao = -1;
     else num = c - '0';
     while((c = cgetchar()) != EOF && '0' <= c && '9' >= c){
         num = num * 10 + c - '0';
     }
     return num * fuhao;
 }
 
 int main ()
 {
     int x,y,i,j,m=0,A[100][100];
  
     x = getnum();
     y = getnum();
     if(x>100||y>100)
     {
         cout<<"請重新輸入:";
         cin>>x>>y;
     }
     for(i=0;i<x;i++)
     {
         for(j=0;j<y;j++)
         {
             A[i][j] = getnum();
             printf("%d ", A[i][j]); 
         }
         printf("\n");
     }
     int sum[100]={0},max=0,result=A[0][0];  
     for(i=0;i<x;i++)
     {
         while(m+i<x)
         {
             for(j=0;j<y;j++)
             {
                 sum[j]=sum[j]+A[m+i][j];
             }
             max=0;
             for(j=0;j<y;j++)
             {
                 if(max+sum[j]>sum[j])
                 {
                     max=max+sum[j];
                 }
                 else
                 {
                     max=sum[j];
                 }
                 if(max>result)
                 {
                     result=max;
                 }
             }
             m++;//是子陣列的行數+1
         }
         m=0;
         for(j=0;j<y;j++)
         {
             sum[j]=0;
         }
     }
     cout<<result;
     return 0;
 }