naoep 2022-02-11 14:23
浏览 221
已结题

动态规划1282:最大子矩阵(语言-c++)

【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 × 1)子矩阵。

比如,如下4 × 4的矩阵

0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是

9 2
-4 1
-1 8
这个子矩阵的大小是15。

【输入】
输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。

【输出】
输出最大子矩阵的大小。

【输入样例】
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
【输出样例】
15
我想用动态规划的方法做,但是只过了3个点:

#include<iostream>
using namespace std;
int n,a[110][110];//定义边长n和矩阵a 
int b[110];
int dp[110];
const int MIN=(10001*-128);
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];//输入矩阵 
        }
    }
    int ma=MIN;//ma先设为最小值 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            b[j]+=a[i][j];//将a的第i行加给b 
        }
        dp[1]=b[1];//将dp的第一项赋值为b的第一项 
        int mx=dp[1];
        for(int j=2;j<=n;j++){
            dp[j]=max(b[j],dp[j-1]+b[j]);
            if(dp[j]>mx)mx=dp[j];
        }
        if(mx>ma)ma=mx;
    }
    for(int i=1;i<n;i++){//最后一行不能删去 
        for(int j=1;j<=n;j++){
            b[j]-=a[i][j];//将a的第i行从b中删去 
        }
        dp[1]=b[1];
        int mx=MIN;
        for(int j=2;j<=n;j++){
            dp[j]=max(b[j],dp[j-1]+b[j]);
            if(dp[j]>mx)mx=dp[j];
        }
        if(mx>ma)ma=mx;
    }
    cout<<ma;//输出答案 
    return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 2月19日
    • 创建了问题 2月11日

    悬赏问题

    • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
    • ¥15 孟德尔随机化怎样画共定位分析图
    • ¥18 模拟电路问题解答有偿速度
    • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
    • ¥15 误删注册表文件致win10无法开启
    • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
    • ¥60 ESP32怎么烧录自启动程序
    • ¥50 html2canvas超出滚动条不显示
    • ¥15 java业务性能问题求解(sql,业务设计相关)
    • ¥15 52810 尾椎c三个a 写蓝牙地址