首页 > 其他分享 >HZOJ 最大子阵和 动态规划

HZOJ 最大子阵和 动态规划

时间:2022-12-25 21:57:20浏览次数:41  
标签:map 子阵 int max 矩阵 累加 HZOJ 要么 动态

题面:

 

解题思路:

最大的子矩阵和要么在前面,要么在后面,要么在中间,取两个变量m,max,m为不断累加的值,累加到小于等于0时就置零,保证后面加到的数不受前面影响。在累加过程中由max存最大的m值。

对矩阵的数据处理:

a[i][j] += a[i][j-1];// a[i][j]保存第i行1~j列数值之和

或者 a[i][j] += a[i-1][j]//a[i][j]保存第j列1~i行数值之和

通过三层循环依次计算每个矩阵的和 m += a[k][j] - a[k][i] 或者 m+= a[j][k] - a[i][k];

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int N,map[101][101];
    cin>>N;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            cin>>map[i][j];
            map[i][j] += map[i][j-1];//map[i][j]表示第i行 ,1到j列的数值之和 
        }
    }
    int max=-1,m=0;
    for(int i=0;i<N;i++){//一行内的左开始
        for(int k=i+1;k<=N;k++){//一行内的右开始
            m=0;
            for(int j=1;j<=N;j++){
                m+=map[j][k]-map[j][i];
                if(m>max) max=m;
                if(m<0) m=0;
            }
        }
    }
    cout<<max<<endl;
}

 

标签:map,子阵,int,max,矩阵,累加,HZOJ,要么,动态
From: https://www.cnblogs.com/anaxiansen/p/17004657.html

相关文章