一.题目:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
二.思路分析:
1.我们先建立一个新的二维数组b[n][m]
二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0] 的最大值
2.具体循环工作:
当循环到a[j][k](0<=j<n,0<=k<m),则求的是 a[j][k]到 a[0][0] 的最大值
3.计算方法:
b[j][k]=a[j][k]+b[j-1][k]+b[j][k-1]-b[j-1][k-1],若b[j][k]<0,则赋值为0;每次计算完成后,都需要与max进行比较。
三.代码:
#include<iostream> using namespace std; int main() { int i,j; int a[3][3]={-1,-2,1,-3,4,2,3,20,-5}; int b[3][3]; int max=a[0][0]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { cout<<a[i][j]<<' '; } cout<<endl; } for(i=0;i<1;i++) { b[0][0]=a[0][0]; for(j=0;j<3;j++) { if(a[0][j-1]<0) { b[0][j]=a[0][j]; } else { b[0][j]=b[0][j-1]+a[0][j]; } } } for(i=1;i<3;i++) { for(j=0;j<1;j++) { if(a[i-1][0]<0) { b[i][0]=a[i][0]; } else { b[i][0]=b[i-1][0]+a[i][0]; } } } for(i=1;i<3;i++) { for(j=1;j<3;j++) { if(b[i-1][j-1]<0) { if(b[i-1][j]>=0&&b[i][j-1]>=0) { if(b[i][j-1]>=b[i-1][j]) { b[i][j]=b[i][j-1]+a[i][j]; } else { b[i][j]=b[i-1][j]+a[i][j]; } } else if(b[i-1][j]>=0&&b[i][j-1]<=0) { b[i][j]=b[i-1][j]+a[i][j]; } else if(b[i-1][j]<=0&&b[i][j-1]>=0) { b[i][j]=b[i][j-1]+a[i][j]; } else { b[i][j]=a[i][j]; } } else { if(b[i-1][j]>=0&&b[i][j-1]>=0) { b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1]; } else if(b[i-1][j]>=0&&b[i][j-1]<=0) { b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1]; } else if(b[i-1][j]<=0&&b[i][j-1]>=0) { b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1]; } else { b[i][j]=a[i][j]; } } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(b[i][j]>max) max=b[i][j]; } } cout<<"最大子数组的和为:"<<max<<endl; return 0; }
四.结果截图:
五.总结:
本次设计让我更加深刻的认识到了结对开发的重要性,我和崔鹏勃确定算法以后,在编程的时候遇到了难题,通过讨论将代码实现,比如说我们在循环计算的时候,对如何实现所有的可能性进行了讨论等。