一個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 }