UVA 1374,迭代加深搜索模板

用已经有的元素进行加、减搜索,进行定位; 先加、后减;
不能出现重复不代表一定要判重,看算法的的处理数据大不大; 看迭代加深不需要判重,只需注意越界
并且总是用“刚刚得到”的那个数,进入下一层:

	   for(int i = d; i >= 0; i--) {
        a[d + 1] = a[d] + a[i];   //先加,d是刚刚得到数字的下标
        if(dfs(d + 1, maxd)) return true;
        a[d + 1] = a[d] - a[i];   //后加。d是刚刚得到数字的下标
        if(dfs(d + 1, maxd)) return true;
    }

模板

#include
using namespace std;

bool dfs(int d, int maxd) {
	if() return true; 	//成功条件
	if() return false; 	//到达深度
	if() return false; 	//IDA*启发函数
	for() //n种接下来的走法
	{
		//修改
		statement 1;
		if(dfs(d + 1, maxd) return true;
		//可以考虑回溯,如果不是状态量,例如vis,可以考虑不回溯例如本题,直接修改
		statement 2;
		if(dfs(d + 1, maxd) return true;
	}
	return false;
}

int solve() {
	//从1开始搜索,如果没有实验的话,不知道最大值就空着,如果知道最大值,可以搜索最大值的小1,如果都是false 就return 最大值
	for(int maxd = 1; ; maxd++) {
		if(dfs(0, maxd) return maxd;
	}
	return max_ans;
}

int main() {
	//处理输入
	
	cout << solve() << endl;
}

当题目样例不是很多是,可以用打表来压缩时间复杂度;

你可能感兴趣的:(笔记)