一个N×M的由非负整数构成的数字矩阵,你须要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少。ios
输入格式:ide
输入第1行有一个正整数T,表示了有T组数据。spa
对于每一组数据,第1行有两个正整数N和M,表示了数字矩阵为N行M列。3d
接下来N行,每行M个非负整数,描述了这个数字矩阵。code
输出格式:blog
输出包含T行,每行一个非负整数,输出所求得的答案。ip
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
对于第1组数据,取数方式以下:get
[67] 75 63 10string
29 29 [92] 14it
[21] 68 71 56
8 67 [91] 25
对于20%的数据,N, M≤3;
对于40%的数据,N, M≤4;
对于60%的数据,N, M≤5;
对于100%的数据,N, M≤6,T≤20。
————————————————我是分割线————————————————————
1 /* 2 Problem: 3 OJ: 4 User: S.B.S. 5 Time: 6 Memory: 7 Length: 8 */ 9 #include<iostream> 10 #include<cstdio> 11 #include<cstring> 12 #include<cmath> 13 #include<algorithm> 14 #include<queue> 15 #include<cstdlib> 16 #include<iomanip> 17 #include<cassert> 18 #include<climits> 19 #include<functional> 20 #include<bitset> 21 #include<vector> 22 #include<list> 23 #define F(i,j,k) for(int i=j;i<=k;++i) 24 #define M(a,b) memset(a,b,sizeof(a)) 25 #define FF(i,j,k) for(int i=j;i>=k;i--) 26 #define maxn 10001 27 #define inf 0x3f3f3f3f 28 #define maxm 4001 29 #define mod 998244353 30 //#define LOCAL 31 using namespace std; 32 int read(){ 33 int x=0,f=1;char ch=getchar(); 34 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 35 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 36 return x*f; 37 } 38 int n,m; 39 int ans; 40 int a[15][15]; 41 int dx[9]={0,1,1,1,0,0,-1,-1,-1},dy[9]={0,1,-1,0,-1,1,0,1,-1};//方向增量 42 int can[15][15];//表示是否可选 43 void DFS(int i,int j,int now){//i为行,j为列,now为现值 44 if(j>m){//列超出,行+1,列归1 45 i++; 46 j=1; 47 } 48 if(i>n){//行超出,更新ans,结束 49 if(now>ans)ans=now; 50 return; 51 } 52 int k; 53 if(can[i][j]==0){//选 54 for(k=1;k<9;k++)can[i+dx[k]][j+dy[k]]++;/*这次不能用bool存储,可能有多重状态*/ 55 DFS(i,j+2,now+a[i][j]); 56 for(k=1;k<9;k++)can[i+dx[k]][j+dy[k]]--; 57 } 58 DFS(i,j+1,now);//不选 59 } 60 int main(){ 61 int t,i,j; 62 scanf("%d",&t); 63 while(t--){ 64 scanf("%d%d",&n,&m); 65 ans=0; 66 for(i=1;i<=n;i++){ 67 for(j=1;j<=m;j++)scanf("%d",&a[i][j]); 68 } 69 memset(can,0,sizeof(can)); 70 DFS(1,1,0); 71 printf("%d\n",ans); 72 } 73 return 0; 74 }