程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU4925-Apple Tree

HDU4925-Apple Tree

編輯:C++入門知識

HDU4925-Apple Tree


題意:n*m網格中種蘋果,每個網格要麼施肥,要麼種一個蘋果,每個種蘋果的格子,如果它的上下左右有各自有施肥的話,每有一個,蘋果數量*2,求怎麼種使得蘋果數量最多。


思路:交叉種植,即黑白染色法可得到最優解。注意特判當n=m=1時的情況。


#include 
#include 
#include 
#include 

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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved