取數遊戲
阿新 • • 發佈:2020-10-22
題目描述
一個N \times MN×M的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰(若一個數字在另外一個數字相鄰88個格子中的一個即認為這兩個數字相鄰),求取出數字和最大是多少。
輸入格式
第1行有一個正整數TT,表示了有TT組資料。
對於每一組資料,第一行有兩個正整數NN和MM,表示了數字矩陣為NN行MM列。
接下來NN行,每行MM個非負整數,描述了這個數字矩陣。
輸出格式
TT行,每行一個非負整數,輸出所求得的答案。
輸入輸出樣例
輸入
3 4 4 67 75 63 10 29 29 92 14 21 68 71 56 8 67 91 25 2 3 87 70 85 10 3 17 3 3 1 1 1 1 99 1 1 1 1
輸出
271 172 99
分析
選擇每種情況的時候會影響到後面的情況,所以需要用陣列儲存,之後直接搜尋即可
程式
#include <bits/stdc++.h> #define F(i , a , b) for(int i = (a) ; i <= (b) ; i++) using namespace std; int T, n, m, a[1001][1001]; int ans; int check[1001][1001]; void dfs(int x , int y , int z) { if(x > n) { ans = max(ans , z); return; } int X_Next = x; int Y_Next = y + 1; if(Y_Next > m) { Y_Next = 1; X_Next = x + 1; } if(! check[x - 1][y - 1] && ! check[x - 1][y] && ! check[x - 1][y + 1] && ! check[x][y - 1] && ! check[x][y + 1] && ! check[x + 1][y - 1] && ! check[x + 1][y] && ! check[x + 1][y + 1]) { check[x][y] = 1; dfs(X_Next , Y_Next , z + a[x][y]); check[x][y] = 0; } dfs(X_Next , Y_Next , z); } int main() { ios::sync_with_stdio(0); cin >> T; F(k , 1 , T) { ans = 0; cin >> n >> m; F(i , 1 , n) F(j , 1 , m) cin >> a[i][j]; dfs(1 , 0 , 0); cout << ans << endl; } return 0; }