题目大意:给出N* M 的矩阵,然后每个格子要不种苹果,要不施肥:在(X,Y)施肥后,它上下左右的苹果树的产量会翻倍。种了苹果数,产量为1.求这样的N * M个矩阵能得到的最大的苹果数。
解题思路:
对于2 * 2的矩阵: X代表施肥 , 有数字代表种树 X 2 这样是最好的。各自上的数字代表这个格子被施肥几次。那么2 * 2的最多的苹果数 2 ^2 + 2^2 = 8;
2 X
3 * 3 : X 3 X
3 X 3
X 3 X 4 * 2^3 = 32;
发现规律:第一行第一个都是拿来施肥的,每次从第一行的第2个开始查找,它上下左右的各自都拿来施肥,这样能够最大化的影响它的产量,产量2^N(上下左右的格子个数),并且施肥的地方要标记一下,下次不能在这里种树。这样往后找,最后得到总产量。
代码:
#include <cstdio> #include <cstring> const int N = 105; const int M = 4; int visit[N][N]; const int dir[M][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; int main () { int t; int n, m; int ans, temp; scanf ("%d", &t); while (t--) { scanf ("%d%d", &n, &m); memset (visit, 0, sizeof(visit)); visit[0][0] = 1; ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { if (visit[i][j]) continue; temp = 0; for (int k = 0; k < M; k++) { if (i + dir[k][0] >= 0 && i + dir[k][0] < n && j + dir[k][1] >= 0 && j + dir[k][1] < m) { temp++; visit[i + dir[k][0]][j + dir[k][1]] = 1; } } ans += 1<<temp; } if (!ans) printf ("1\n"); else printf ("%d\n", ans); } return 0; }
hdu4925Apple Tree(找规律)
时间: 2024-10-03 06:51:14