POJ 2248 - Addition Chains [DFS, 반복 검색 심화]

제목 연결:http://poj.org/problem?id=2248
제목: 현재 하나의 배열 중 a [1] = 1, a [m] = n, 그리고 a [1] < a [2] <..........................................................그 중 1 < = n < = 9
대체적인 사고방식: 만약 우리 가 DFS 에 따라 직접 검색 한다 면 모두 n 이 있 습 니 다!하나의 노드 가 매우 오래 걸 립 니 다. 이 럴 때 우 리 는 반복 적 으로 검색 을 강화 할 수 있 습 니 다. 모든 검색 은 검색 깊이 를 제한 하고 검색 깊이 를 한 단계 씩 늘 려 서 답 을 찾 을 때 까지 알 수 있 습 니 다.
코드:
#include 
#include 
#include 
#include 
using namespace std;

const int MAXN = 110;
bool vis[MAXN];
int ans[MAXN];
int maxd,n;

bool DFS(int d){
	if(d > maxd){
        if(ans[maxd] == n) return true;
        else return false;
	}
	memset(vis,0,sizeof(vis));
	for(int i = d - 1; i >= 1; i--){
        for(int j = d - 1; j >= 1; j--){
            if(ans[i] + ans[j] <= ans[d - 1]) break;
            if(!vis[ans[i] + ans[j]] && ans[i] + ans[j] <= n){
            	ans[d] = ans[i] + ans[j];
            	vis[ans[d]] = 1;
            	if(DFS(d + 1)) return true;
            }
        }
	}
	return false;
}

int main(int argc, char const *argv[])
{
	while(~scanf("%d",&n) && n){
		bool ok = false;
		ans[1] = 1;
		//ans[0] = 0;
		if(n == 1) { cout << "1" << endl; continue; }
		for(maxd = 2; ; maxd++){
			memset(vis,0,sizeof(vis));
			if(DFS(2)) { ok = true; break; }
		}
		//cout << maxd << endl;
		if(ok){
			for(int i = 1; i < maxd; i++) cout << ans[i] << " ";
            cout << ans[maxd] << endl;
		}
	}
	return 0;
}

좋은 웹페이지 즐겨찾기