2 2 2 3 3
8 32
枚举两种情况求最大值。。
#include"stdio.h"
#include"string.h"
#include"queue"
#include"vector"
using namespace std;
#define N 105
#define M 1000000
int g[N][N];
int n,m;
int dir[4][2]={0,1,0,-1,-1,0,1,0};
int judge(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m)
        return 1;
    return 0;
}
int main()
{
    int T,i,j;
    int k,x,y;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof(g));
        __int64 ans=0,max;
        ans=max=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if((i+j)%2)          //奇数的种苹果树
                    g[i][j]=1;
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(g[i][j]==0)
                    continue;
                for(k=0;k<4;k++)
                {
                    x=i+dir[k][0];
                    y=j+dir[k][1];
                    if(judge(x,y)&&g[x][y]==0)
                    {
                        g[i][j]*=2;
                    }
                }
                ans+=g[i][j];
            }
        }
        max=ans;
        ans=0;
        memset(g,0,sizeof(g));
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if((i+j)%2==0)     //偶数的种苹果树
                    g[i][j]=1;
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(g[i][j]==0)
                    continue;
                for(k=0;k<4;k++)
                {
                    x=i+dir[k][0];
                    y=j+dir[k][1];
                    if(judge(x,y)&&g[x][y]==0)
                    {
                        g[i][j]*=2;
                    }
                }
                ans+=g[i][j];
            }
        }
        max=max>ans?max:ans;
        printf("%I64d\n",max);
    }
    return 0;
}
hdu 4925 Apple Tree,布布扣,bubuko.com
原文:http://blog.csdn.net/u011721440/article/details/38434323