最大子矩阵 hdu 1559 poj 1050

来源:互联网 发布:信用卡淘宝买东西套现 编辑:程序博客网 时间:2024/06/06 02:11

dp    poj 1050(To the Max)

hdu 1559 (最大子矩阵)

题意:给出一个二维数组,问最大子矩阵的和是多少。hdu 规定了子矩阵的边界。

题解:poj    将二维转化为一维,相当于求最大连续子序列,可以把每行的和求出来,b[i][j] 代表第i行前j个数的和,

然后根据一维的方法,求出i到j行列的最大和。

<span style="font-size:18px;"><span style="font-size:18px;">#include<cstdio>using namespace std;int main(){int n,i,j,k,s;int maxi=0;int a[110][110]={0};int b[110][110]={0};scanf ("%d",&n);for (i=0;i<n;i++){for (j=1;j<=n;j++){scanf ("%d",&a[i][j-1]);b[i][j]=b[i][j-1]+a[i][j-1];}}for (i=0;i<n;i++){for (j=i;j<=n;j++){s=0;for (k=0;k<n;k++){s+=b[k][j]-b[k][i];if (s<0)s=0;else if (s>maxi)maxi=s;}}}printf ("%d\n",maxi);return 0;} </span></span>

题解:hdu    dp[i][j]代表长i宽j的矩阵和(dp [i] [j] += dp [i-1] [j] + dp [i] [j-1] - dp [i-1] [j-1])  (dp[i-1][j-1])为重复部分。a[i][j]为右下角的元素。

所以长x宽j的矩阵和就是(dp [i] [j] - dp [i-x] [j] - dp [i] [j-y] + dp [i-x] [j-y])

详细题解

<span style="font-size:18px;">#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>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;}</span>

 


0 0
原创粉丝点击