1. 程式人生 > >洛谷 P1123 取數遊戲

洛谷 P1123 取數遊戲

題目描述

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

輸出樣例#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;
}