1.26B补好思路

思路:定义temp这个数组对表中可能出现的组合进行一一表示,例如temp[1][1][1]=a[1][1],而temp[1][1][n]=a[1][1]+a[1][2]+到a[1][n],temp[1][n][n]=a[n][1]+a[n][2]+到a[n][n],容易看出temp数组随着k,i,j的不同,可以取各种组合。从而找到最大值。


#include<stdio.h>
#include<string.h>
int n,a[105][105],tmp[105][105][105]; //a[][]为输入,tmp[k][i][j]中保存第k列,从i行到j行的综合。
void Set()    //初始化tmp
{
    memset(tmp,0,sizeof(tmp));
    int i,j,k;
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            scanf("%d",&a[i][j]);
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=i; j<=n; j++)
                for(int p=i; p<=j; p++)
                    tmp[k][i][j]+=a[p][k];
}
int main()
{
    while(~scanf("%d",&n))
    {
        Set();
        int sum,_max=0,i,j,k;//此题不存在每个数都为负的情况。
        for(i=1; i<=n; i++)
            for(j=i; j<=n; j++)
            {
                sum=0;    //每计算一组从i行到j行的矩形都要给sum先清零。
                for(k=1; k<=n; k++) //同一维数组的寻找连续字串的和。
                {
                    sum+=tmp[k][i][j];
                    if(sum<0) sum=0;
                    if(sum>_max) _max=sum;
                }
            }
        printf("%d\n",_max);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值