[算法课]图选数字 原创

更新

手贱加了个else,
实际上这里被我搞成走一个可能,而不是两个
数列再回溯上来之后进到下一个dfs的时候因为else的关系直接被跳过
所以说这个时候的状态2实际直接被跳了

正确答案 749

题目来源 网络

算法标签 递归

题目描述

在一个由 n 行 m 列的方格组成的地图上,每个方格上有一个数,你要取出一些数,使得他们的和值最大。
但是有一个条件,你选取的数中,任意 2 个数所在的方格都不能相邻。
2 个方格相邻就是指他们共享一条边。

48, 30, 39, 87,
48, 91, 90, 22,
36, 60, 41, 28,
49, 96, 37, 88,
87, 71, 96, 66,
15, 24, 75, 55

说明:如果挑了91,则30和48和90和60是不能挑的!

思路

爆搜找所有符合条件的序列,比较序列大小,输出最大序列和

时间复杂度

正确答案

749

题目代码

做法1
#include<iostream>
using namespace std;

int n, m;
int num[10][10]; 
bool st[10][10];
int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
int ans, s;

int Max(int a,int b){return a>b?a:b;}
int a[6][4] = { 48, 30, 39, 87,
				48, 91, 90, 22,
				36, 60, 41, 28,
				49, 96, 37, 88,
				87, 71, 96, 66,
				15, 24, 75, 55
};

void dfs(int x, int y)
{
	if (y == m)x++, y=0;
	if (x == n) {ans = Max(ans, s);return;}

	bool flag = true;
	for (int i = 0; i < 4; i++)
	{
		int tx = dx[i] + x, ty = dy[i] + y;
		if (tx<0&&tx>n&&ty<0&&ty>m)continue;
		if (st[tx][ty]) { flag = false; break; }
	}

	if (flag)
	{
		s += a[x][y];
		st[x][y] = true;
		dfs(x, y+1);
		st[x][y] = false;
		s -= a[x][y];
	}
    
    dfs(x, y+1);
}
int main()
{
	n = 6, m = 4;

	dfs(0, 0);

	cout << ans;

	return 0;
}
做法二

从1,1开始起始,不用判断偏移量时的边界问题
从1,1开始相当于其他部分全部用为走过来判断。

#include<iostream>

using namespace std;

int n, m;
int num[10][10]; 
bool st[12][12];

int ans, s;

int Max(int a,int b){return a>b?a:b;}
int a[7][5] = { 0, 0, 0,  0,  0,
                0,48, 30, 39, 87,
				0,48, 91, 90, 22,
				0,36, 60, 41, 28,
				0,49, 96, 37, 88,
				0,87, 71, 96, 66,
				0,15, 24, 75, 55
};

bool check(int x,int y){return (!st[x+1][y]&&!st[x][y+1]&&!st[x-1][y]&&!st[x][y-1])? true:false;}
void dfs(int x, int y,int s)
{
	if (y == m+1)y = 0, x++;
	if (x == n+1) {ans = Max(ans, s);return;}
	
	if (check(x,y))
	{
		st[x][y] = true;
		dfs(x, y+1,s+a[x][y]);
		st[x][y] = false;
	}
    
    dfs(x, y+1,s);
}

int main()
{
	n = 6, m = 4;

	dfs(1, 1,0);

	cout << ans;

	return 0;
}


posted @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示