题目链接

题意 : 给你一块n×m的矩阵,每一个格子可以施肥或者是种苹果,种一颗苹果可以得到一个苹果,但是如果你在一个格子上施了肥,那么所有与该格子相邻(指上下左右)的有苹果树的地方最后得到的苹果是两倍,如果(i,j)有一颗苹果树,(i-1,j)与(i,j+1)施了肥,那么苹果应该是1的两倍2,2的两倍4,最后是4个苹果,问你怎么安排苹果和施肥的格子使最后得到的苹果最多。

思路 : 画了图就可以看出来,苹果和苹果,肥与肥之间不要相邻就好了,所有的苹果之间都有施肥,所有施肥的格子都被苹果隔开了才能得到最多的苹果。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #define LL long long
 5 
 6 using namespace std ;
 7 
 8 int mp[110][110] ;
 9 
10 int main()
11 {
12     int T ,n,m;
13     cin >> T ;
14     while(T--)
15     {
16         cin >> n >> m ;
17         if(n == 1 && m == 1)
18         {
19             printf("1\n") ;
20             continue ;
21         }
22         memset(mp,0,sizeof(mp)) ;
23         for(int i = 1 ; i <= n ; i++)
24         {
25             if(i % 2)
26             {
27                 for(int j = 1 ; j <= m ; j += 2)
28                     mp[i][j] = 1 ;
29             }
30             else
31             {
32                 for(int j = 2 ; j <= m ; j += 2)
33                     mp[i][j] = 1 ;
34             }
35         }
36         LL ans = 0,cnt;
37         for(int i = 1 ; i <= n ; i++)
38         {
39             for(int j = 1 ; j <= m ; j++)
40             {
41                 cnt = 0 ;
42                 if(mp[i][j]) continue ;
43                 if(i-1 >= 1 && mp[i-1][j]) cnt ++ ;
44                 if(i+1 <= n && mp[i+1][j]) cnt ++ ;
45                 if(j-1 >= 1 && mp[i][j-1]) cnt ++ ;
46                 if(j+1 <= m && mp[i][j+1]) cnt ++ ;
47                 ans += 1LL << cnt ;
48             }
49         }
50         printf("%I64d\n",ans) ;
51     }
52     return 0 ;
53 }
View Code

 

posted on 2014-08-07 20:37  枫、  阅读(259)  评论(0编辑  收藏  举报