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>