zoukankan      html  css  js  c++  java
  • 蓝桥杯 历届试题 最大子阵

      历届试题 最大子阵  
    时间限制: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;
    }
    

      

  • 相关阅读:
    中文字,文本框,button按钮垂直居中对齐方法
    Denny_Yang的语录
    为SELECT结果集添加伪序号列
    考勤系统问题记录一:事务日志太大
    在DateTable中进行数据统计(不用循环)
    今天去游泳了
    关于HbSrv.exe
    有感于--特洛伊
    windows下DNS的问题
    Google新功能
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5122172.html
Copyright © 2011-2022 走看看