P2363 马农

题目描述

在观看完战马检阅之后,来自大草原的两兄弟决心成为超级“马农”,专门饲养战马。

兄弟两回到草原,将可以养马的区域,分为N*N的单位面积的正方形,并实地进行考察,归纳出了每个单位面积可以养马所获得的收益。接下来就要开始规划他们各自的马场了。首先,两人的马场都必须是矩形区域。同时,为了方便两人互相照应,也为了防止马匹互相走散,规定两个马场的矩形区域相邻,且只有一个交点。最后,互不认输的两人希望两个马场的收益相当,这样才不会影响他们兄弟的感情。现在,兄弟两找到你这位设计师,希望你给他们设计马场,问共有多少种设计方案 输入输出格式

输入格式

第一行一个整数N,表示整个草原的大小为N*N。接下来N行,每行N个整数A(i,j),表示第i行第j列的单位草地的收成。(注意:收益可能是负数,养马也不是包赚的,马匹也可能出现生病死亡等意外。)

输出格式:

输出符合两人要求的草原分配方案数。

输入样例

3 1 2 3 4 5 6 7 8 9

输出样例

2

说明

n<=50

思路:

用暴力去枚举相交的点,设为A,在枚举上面格子的顶点B 枚举下面格子的顶点C,再去判断符不符合题意就行了。 (注意有两种情况,都要枚举)

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=2010;

int n,ans;
int f[N][N];
int a[N][N];
int d[N*N*10];

int main () {
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++) {
            scanf("%d",&a[i][j]);
            f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
        }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++) {
            for(int x=1; x<=i; x++)
                for(int y=1; y<=j; y++)
                    d[f[i][j]-f[i][y-1]-f[x-1][j]+f[x-1][y-1]]++;
            for(int x=i+1; x<=n; x++)
                for(int y=j+1; y<=n; y++)
                    ans+=d[f[x][y]-f[x][j]-f[i][y]+f[i][j]];
            for(int x=1; x<=i; x++)
                for(int y=1; y<=j; y++)
                    d[f[i][j]-f[i][y-1]-f[x-1][j]+f[x-1][y-1]]=0;
            for(int x=1; x<=i; x++)
                for(int y=j+1; y<=n; y++)
                    d[f[i][y]-f[x-1][y]-f[i][j]+f[x-1][j]]++;
            for(int x=i+1; x<=n; x++)
                for(int y=1; y<=j; y++)
                    ans+=d[f[x][j]-f[i][j]-f[x][y-1]+f[i][y-1]];
            for(int x=1; x<=i; x++)
                for(int y=j+1; y<=n; y++)
                    d[f[i][y]-f[x-1][y]-f[i][j]+f[x-1][j]]=0;
        }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2019-08-11 00:52  双子最可爱啦  阅读(207)  评论(0编辑  收藏  举报