题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925
解题报告:给你n*m的土地,现在对每一块土地有两种操作,最多只能在每块土地上进行两种操作,第一种是种苹果树操作,第二种是施肥操作,种苹果树操作可以使得该块地
长出一个苹果,施肥操作可以使得与这块土地相邻的土地的苹果产量变为原来的两倍,问可以得到的最多的苹果数量是多少?
例如一个4*4的土地,用1表示在该土地上做第一种操作,0表示在该土地上做第二种操作,可以得到最多苹果的操作如下:
0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0
也就是说对于第i行第j列,如果(i + j)为奇数的话就种树,其它的土地都施肥。
注意要对1 * 1的土地加特判。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = +;
int map[maxn][maxn];
int _x[] = {-,,,};
int _y[] = {,,,-};
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
if(n == && m == )
{
printf("1\n");
continue;
}
memset(map,,sizeof(map));
for(int i = ;i <= n;++i)
for(int j = ;j <= m;++j)
if((i + j) & )
map[i][j] = ;
for(int i = ;i <= n;++i)
for(int j = ;j <= m;++j)
if(!map[i][j])
for(int k = ;k < ;++k)
{
int x = i + _x[k];
int y = j + _y[k];
if(x >= && x <= n && y >= && y <= m)
map[x][y] *= ;
}
int ans = ;
for(int i = ;i <= n;++i)
for(int j = ;j <= m;++j)
ans += map[i][j];
printf("%d\n",ans);
}
return ;
}