P1123 取数游戏
题目描述
一个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; }