题意:n*m网格中种苹果,每个网格要么施肥,要么种一个苹果,每个种苹果的格子,如果它的上下左右有各自有施肥的话,每有一个,苹果数量*2,求怎么种使得苹果数量最多。
思路:交叉种植,即黑白染色法可得到最优解。注意特判当n=m=1时的情况。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 105; int n, m; int g[MAXN][MAXN]; int deal(int x, int y) { int sum = 1; if (g[x][y - 1] == 1) sum *= 2; if (g[x][y + 1] == 1) sum *= 2; if (g[x - 1][y] == 1) sum *= 2; if (g[x + 1][y] == 1) sum *= 2; return sum; } int main() { int cas; scanf("%d", &cas); while (cas--) { scanf("%d%d", &n, &m); if (n == 1 && m == 1) { printf("1\n"); continue; } memset(g, 0, sizeof(g)); int flag = 1; if (m % 2 == 1) { for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { g[i][j] = flag; flag = -flag; } } else { for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { g[i][j] = flag; flag = -flag; } flag = -flag; } } long long ans = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (g[i][j] == -1) ans += deal(i, j); printf("%lld\n", ans); } return 0; }