2021-04-03

**

//最大一维数组字段和

**
//输入一个数字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<n
n;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;
}

//环状矩阵的最大非空子矩阵

//环状矩阵的第一行与最后一行连接,最右边和最左边连接
//想要求非空子矩阵的最大矩阵和
//这里的最大子矩阵是若干行和若干列
//输出一个整数,代表这个环状矩阵的最大非空子矩阵和
//拆环的方法最简单的就是复制,向右,向下,向右下都复制一份

在这里插入代码片
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值