DP求一类最大子矩阵

HDU 最大子矩阵 1559 

利用容斥原理求出(0,0)到(i,j)的矩阵里的值的和,类似一维的前缀和。

#include <cstdio>
#include <cstring>
const int maxn=1001;
int dp[maxn][maxn];

int main ()
{
    int cas;
    int n,m,x,y;
    scanf("%d",&cas);
    for (int I=1 ; I<=cas ; ++I)
    {
        scanf("%d%d%d%d",&n,&m,&x,&y);
        memset (dp , 0 , sizeof(dp));
        int ans=0;
        int tmp;
        for (int i=1 ; i<=n ; ++i)
        {
            for (int 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)
                {
                    tmp=dp[i][j]-dp[i-x][j]-dp[i][j-y]+dp[i-x][j-y];
                    if(tmp>ans)ans=tmp;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}



你可能感兴趣的:(DP求一类最大子矩阵)