**
//最大一维数组字段和
**
//输入一个数字n代表数组大小,依次输入数组的数值
//求出一维数组中最大的字段和并输出
#include<iostream>
using namespace std;
int main()
{
int a[10];
int ans=-0;
int sum=0;
int n;cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
ans=max(ans,a[i]);
}//找出数组中最大的数值,如果小于零,直接输出,如果大于零,进行动态规划,判断增益
if(ans<=0)
{cout<<ans<<endl;}
for(int i=0;i<n;i++)
{
sum+=a[i];
if(sum<0)
{
sum=0;
}//如果增益小于零,那么重新设置为0;
ans=max(ans,sum);//ans一直都会被更新为最大的
}
cout<<ans<<endl;
}
**
## //求二维数组最大的非空子矩阵和(简单类型的)
//输入一个数字n,构造一个nn的二维数组
//思想类似于一维数组处理方法
//把二维数组巧妙地映射为一维数组
//!!!for(int i=0;i<nn;i++)//一共n*n个数
//第i个数所在位置a[i/n][i%n];
//把二维数组转化为一维,就可以和一维数组的做法一样做了
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;cin>>n;
int a[10][10];
int ans=-100;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
ans=max(ans,a[i][j]);
}
}
if(ans<0)
{
cout<<ans<<endl;
}
int sum=0;
for(int i=0;i<n*n;i++)
{
sum+=a[i/3][i%3];
ans=max(ans,sum);
if(sum<0)sum=0;
}
cout<<ans;
return 0;
}
//求二位数组最大的非空子矩阵和(复杂类型的)
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[10][10];
long long b[10][10];
int ans=-10;
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
ans=max(ans,a[i][j]);
}
}
if(ans<0)
{
cout<<ans<<endl;
}
for(int i=1;i<=n;i++)//通过把每一例的数值都累加起来,可以达到和一维数组的效果
{
for(int j=1;j<=n;j++)
{
b[i][j]=b[i-1][j]+a[i][j];
}
}
//解释一下例如最大子矩阵可以一是1行(1,2,3)2行(1,2)(2,3)3行(1,2,3)
//把初始被减行的记为k
for(int k=1;k<=n;k++)
{
for(int i=k;i<=n;i++)
{
int sum=0;
for(int j=1;j<=n;j++)
{
sum+=b[i][j]-b[k-1][j];
//假设k=1;会得到(1)(12)(123)
//假设k=2;会得到(2)(2 3)
//假设k=3;会得到(3)
//这样就会得到所有合成的最终结果
//最终通过遍历比较就可以得到最终的答案
if(sum<0)
sum=0;
ans=max(ans,sum);
}
}
}
cout<<ans<<endl;
return 0;
}
//环状矩阵的最大非空子矩阵
//环状矩阵的第一行与最后一行连接,最右边和最左边连接
//想要求非空子矩阵的最大矩阵和
//这里的最大子矩阵是若干行和若干列
//输出一个整数,代表这个环状矩阵的最大非空子矩阵和
//拆环的方法最简单的就是复制,向右,向下,向右下都复制一份
在这里插入代码片