题意:给你一个N×M的矩阵,一个格子可以放一个苹果树产量为1,也可以施肥使得上下左右的苹果树产量加倍(可叠加)。问你最多能够得到多少苹果
解题思路:简单的构造问题,我们只需要交替放就行了。
解题代码:

1 // File Name: 1005.cpp 2 // Author: darkdream 3 // Created Time: 2014年08月07日 星期四 12时07分48秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int n , m; 28 int ans[300][300]; 29 int p(int x) 30 { 31 int t = 1; 32 for(int i =1;i <= x;i ++) 33 t = t * 2; 34 return t; 35 } 36 int count(int i , int j) 37 { 38 int sum = ans[i-1][j]+ans[i][j-1] + ans[i+1][j] + ans[i][j+1]; 39 return p(sum); 40 } 41 int main(){ 42 int t; 43 scanf("%d",&t); 44 while(t--) 45 { 46 int n , m ; 47 scanf("%d %d",&n,&m); 48 memset(ans,0,sizeof(ans)); 49 for(int i =1;i <= n;i ++) 50 { 51 if(i % 2 == 1) 52 { 53 for(int j =1;j <= m;j ++) 54 { 55 if(j % 2 == 0 ) 56 { 57 ans[i][j] = 1; 58 } 59 } 60 }else{ 61 for(int j = 1;j <= m;j ++) 62 if(j % 2 == 1 ) 63 ans[i][j] = 1; 64 } 65 } 66 LL rans = 0 ; 67 for(int i = 1;i <= n;i ++) 68 for(int j = 1;j <= m;j ++) 69 { 70 if(ans[i][j] == 0) 71 { 72 rans += count(i,j); 73 } 74 } 75 printf("%I64d ",rans); 76 } 77 78 return 0; 79 }