• 蓝桥杯 历届试题 最大子阵


      历届试题 最大子阵  
    时间限制:1.0s   内存限制:256.0MB
        
    问题描述
      给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。

      其中,A的子矩阵指在A中行和列均连续的一块。
    输入格式
      输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
      接下来n行,每行m个整数,表示矩阵A。
    输出格式
      输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
    样例输入
    3 3
    -1 -4 3
    3 4 -1
    -5 -2 8
    样例输出
    10
    样例说明
      取最后一列,和为10。
    数据规模和约定
      对于50%的数据,1<=n, m<=50;
      对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。

    题解:最大子阵;本来是2重循环结果超时了,就改成贪心判断ac了;

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    using namespace std;
    const int INF=0x3f3f3f3f;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define SD(x,y) scanf("%lf%lf",&x,&y)
    #define P_ printf(" ")
    typedef long long LL;
    const int MAXN=550;
    int mp[MAXN][MAXN],dp[MAXN];
    int mx;
    int m,n;
    int solve(int *a){
    	int temp=0;
    	for(int j=0;j<n;j++){
    		if(temp+a[j]<a[j])temp=a[j];
    		else temp+=a[j];
    		mx=max(mx,temp);
    	}
    }
    int main(){
    	scanf("%d%d",&m,&n);
    	mx=-INF;
    	for(int i=0;i<m;i++)
    		for(int j=0;j<n;j++)scanf("%d",&mp[i][j]);
    	for(int i=0;i<m;i++){
    		mem(dp,0);
    		for(int j=i;j<m;j++){
    			for(int k=0;k<n;k++)dp[k]+=mp[j][k];
    			solve(dp);
    		}
    	}
    	printf("%d
    ",mx);
    	return 0;
    }
    

      

  • 相关阅读:
    Unzip 解压报错
    Linux ftp安装
    关于vsftp出现Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法
    ASP.NET开发知识总结
    移动端开发调试方法总结
    移动H5优化指南
    基于windows下,node.js之npm
    微服务理解
    SQL Server 触发器
    jQuery验证控件jquery.validate.js使用说明+中文API
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5122172.html
Copyright © 2020-2023  润新知