洛谷 P1123 取數遊戲
阿新 • • 發佈:2019-01-28
題目描述
一個N×M的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰(若一個數字在另外一個數字相鄰8個格子中的一個即認為這兩個數字相鄰),求取出數字和最大是多少。
輸入輸出格式
輸入格式:輸入第1行有一個正整數T,表示了有T組資料。
對於每一組資料,第1行有兩個正整數N和M,表示了數字矩陣為N行M列。
接下來N行,每行M個非負整數,描述了這個數字矩陣。
輸出格式:輸出包含T行,每行一個非負整數,輸出所求得的答案。
輸入輸出樣例
輸入樣例#1: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組資料,取數方式如下:
[67] 75 63 10
29 29 [92] 14
[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。
資料範圍較小,考慮搜尋。#include<iostream> #include<cstdio> using namespace std; int T,n,m,ans,a[11][11],cnt[11][11],xx[]={1,1,0,-1},yy[]={0,1,1,1}; void dfs(int x,int y,int sum) { if(y>m) { if(sum>ans) ans=sum; return ; } if(cnt[x][y]==0) { sum+=a[x][y]; for(int i=0;i<=3;i++) cnt[x+xx[i]][y+yy[i]]++; if(x==n) dfs(1,y+1,sum); else dfs(x+1,y,sum); sum-=a[x][y]; for(int i=0;i<=3;i++) cnt[x+xx[i]][y+yy[i]]--; } if(x==n) dfs(1,y+1,sum); else dfs(x+1,y,sum); } int main() { scanf("%d",&T); while(T--) { ans=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); dfs(1,1,0); printf("%d\n",ans); } return 0; }