最大子矩阵 杭电1559

/**
 *
 * 最大子矩阵 杭电1559

2014年上机真题

输入的数据在文件input.txt中读取,输出的结果存入output.txt中

 * 思路:动态规划 状态dp[i][j]代表长i宽j的矩阵的元素和。 (dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]) 假设要求找出x长y宽的最大子矩阵 在i>=x且j>=y的矩阵中找的话, dp[i][j]就是包含a[i][j]元素的子矩阵的元素和, 则dp[i][j]-dp[i][j-y]-dp[i-x][j]+dp[i-x][j-y]就是 dp[i][j]中x长y宽的子矩阵的元素和(右下角元素为a[i][j])  https://yq.aliyun.com/articles/18949/  感觉没见过的话   比较难  */ #include<stdio.h> #include<string.h> #include<algorithm> #define max(a,b) (a>b?a:b) using namespace std; int dp[1100][1100]; int MAX; int main() {     int i,j,n,m,T,x,y;     scanf("%d",&T);     while(T--)     {         scanf("%d %d %d %d",&n,&m,&x,&y);         MAX=0;         memset(dp,0,sizeof(dp));         for(i=1;i<=n;i++)             for(j=1;j<=m;j++)             {                 scanf("%d",&dp[i][j]);                 dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];                 if(i>=x&&j>=y)                 {                     MAX=max(MAX,dp[i][j]-dp[i][j-y]-dp[i-x][j]+dp[i-x][j-y]);                 }             }         printf("%d\n",MAX);     }     return 0; }


换为文件输入输出如下:
#include<iostream>
#include<string.h>
#include<algorithm>
#include <fstream>
#include <sstream>

#define max(a,b) (a>b?a:b)
using namespace std;
int dp[1100][1100];
int MAX;
int main()
{
    int i,j,n,m,T,x,y;
    ifstream cinfile;
    cinfile.open("input.txt",ios::in);
    cinfile>>T;
//    scanf("%d",&T);
    while(T--)
    {
//        scanf("%d %d %d %d",&n,&m,&x,&y);

        cinfile>>n>>m>>x>>y;
        MAX=0;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
//                scanf("%d",&dp[i][j]);
                cinfile>>dp[i][j];
                dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
                if(i>=x&&j>=y)
                {
                    MAX=max(MAX,dp[i][j]-dp[i][j-y]-dp[i-x][j]+dp[i-x][j-y]);
                }
            }
//        printf("%d\n",MAX);
        cinfile.close();
        ofstream outfile;
        outfile.open("output.txt",ios::out);
        outfile<<MAX<<endl;

    }

    return 0;
}


2014年上机真题(专硕)

 

循环矩阵(第一列和最后一列是相邻的),求该矩阵中最大子矩阵(就是子矩阵中的元素和最大);输入的数据在文件input.txt中读取,输出的结果存入output.txt中;

输入数据的格式如下:(中间只能一个空格,否则就不能存入数组中)

 

4

1 1 0 2

5 1 -3 1

2 2 -1 4

-7 -8 0 -5


武汉理工的输入格式:

4

1 1 0 2

5 1 -3 1

2 2 -1 4

-7 -8 0 -5

看上去有点像:从4阶矩阵中  选出最大子矩阵。
运用上述思想,可以吧x,y看为变量  进行 比较  。此处略。学会思想即可。



简易版:给定一个整型数组,数组中有正有负,求最大连续子序列的和。

本题可否看为特殊情况??感觉这样处理的话  欠妥  暂略。



设f(n)表示以a[n]为子序列最后一个元素的最大和,则可以有下面的规则:

 

(1)当f(n-1)<0时,f(n)=a[n];

 

(2)当n!=0且f(n-1)>0时,f(n)=f(n-1)+a[n]。

 

用一个nGreatestNum来记录最大值,每次与f(n)进行比较,不断更新即可。

求一个n*n二维矩阵的最大子矩阵,maxSum。













全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务