HDOJ 1081 POJ 1050 ZOJ 1074 TO THE MAX【dp】

题意一句话:给你一个n*n的矩阵,求其中的最大子矩阵和


先考虑1*n的矩阵怎么求:就是一行的数怎么求:

从前往后dp对吧:对于当前第i个数,我们选,是因为加上前面的值仍然大于0,即(5,-3……)这种情况,-3是要选的,因为5-3=2>0

否则的话,把前面那一部分舍弃掉,只取当前的值,因为加起来小于0对求最大值没有意义

每选择一个数,就比较一次最大值就可以了


那么现在来考虑n*n的

我们可以枚举起始行i和起始行j,然后把从第i行的值到第j行的值压缩成一行,那么就是求1*n的矩阵的最大值了

枚举i,j,k是三重循环,在复杂度里面,那么应该怎么压缩呢?!


前缀和!提前把每一列的和存到sum值里就好了


所以这个题的思路出来了:

先用前缀和压缩值,预处理每一列的值放入sum数组

然后枚举行i和j,注意j>=i

然后枚举列k,用1*n的方法来求压缩后的一行的值



代码如下:

#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
using namespace std;

const int maxn=150;
const int INF=0x3f3f3f3f;
int sum[maxn][maxn];
int a[maxn][maxn],n;

void debug(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            printf("%d%c",sum[i][j],j==n?'\n':' ');
}

int main(){
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n)!=EOF){
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        for(int j=1;j<=n;j++){
            sum[1][j]=a[1][j];
            for(int i=2;i<=n;i++)
                sum[i][j]=sum[i-1][j]+a[i][j];
        }
        //debug();
        int ans=-INF;
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++){
                int tmp=0,tmpans=-INF;
                for(int k=1;k<=n;k++){
                    int num=sum[j][k]-sum[i-1][k];
                    if (tmp+num>=0) tmp+=num;
                    else tmp=num;
                    tmpans=max(tmpans,tmp);
                }
                ans=max(ans,tmpans);
            }
        printf("%d\n",ans);
    }
    return 0;
}


全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
443735次浏览 4528人参与
# 春招别灰心,我们一人来一句鼓励 #
42340次浏览 539人参与
# 北方华创开奖 #
107496次浏览 600人参与
# 地方国企笔面经互助 #
7980次浏览 18人参与
# 同bg的你秋招战况如何? #
77401次浏览 569人参与
# 实习必须要去大厂吗? #
55833次浏览 961人参与
# 阿里云管培生offer #
120529次浏览 2222人参与
# 虾皮求职进展汇总 #
116568次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11726次浏览 292人参与
# 实习,投递多份简历没人回复怎么办 #
2455118次浏览 34862人参与
# 提前批简历挂麻了怎么办 #
149972次浏览 1979人参与
# 在找工作求抱抱 #
906148次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4765次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196098次浏览 18551人参与
# 机械人春招想让哪家公司来捞你? #
157652次浏览 2267人参与
# 双非本科求职如何逆袭 #
662434次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12817次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35967次浏览 384人参与
# 简历中的项目经历要怎么写? #
86958次浏览 1517人参与
# 参加完秋招的机械人,还参加春招吗? #
20158次浏览 240人参与
# 我的上岸简历长这样 #
452090次浏览 8089人参与
牛客网
牛客企业服务