⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1682.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 CPP
字号:
/* This Code is Submitted by wywcgs for Problem 1682 on 2006-09-14 at 16:08:23 */
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
 
const int N = 9, SN = 1 << N;
const int INF = 1 << 20;
 
int len[SN], prev[SN], v[SN], ledz[SN], n;
char num[N+1];
map<int, int> dic;
 
int find(int);
 
int main()
{
	while(gets(num)[0] != '0') {
		n = strlen(num); dic.clear();
		memset(len, -1, sizeof(len)); memset(prev, -1, sizeof(prev));
		for(int i = 1; i < (1<<n); i++) {
			ledz[i] = 0;
			for(int j = v[i] = 0; j < n; j++) {
				if(!(i&(1<<j))) continue;
				v[i] = v[i]*10+num[j]-'0';
				if(v[i] == 0) ledz[i]++;
			}
			if(ledz[i] == 1 && v[i] == 0) ledz[i] = 0;
			if(!ledz[i] && !dic.count(v[i])) dic[v[i]] = i;
		}
		find((1<<n)-1);
		for(int now = (1<<n)-1; now > 0; now = prev[now]) {
			for(int i = 0; i < n; i++)
				if(now&(1<<i)) putchar(num[i]);
			putchar(prev[now] == -1 ? '\n' : ' ');
		}
	}
 
	return 0;
}
 
int find(int st)
{
	if(st == 0) return -INF;
	else if(v[st] == 0) { return 0; }
	if(len[st] == -1) {
		len[st] = 0;
		for(int i = 1; i < st; i++) {
			if((st|i) != st || ledz[i] || v[i] <= 1 || v[st]%v[i] != 0) continue;
			int rem = dic.find(v[st^i])->second, nxt = find(rem)+1;
			if(prev[st] == -1 || nxt > len[st] || (nxt == len[st] && v[rem] < v[prev[st]]))
				{ prev[st] = rem; len[st] = nxt; }
		}
	}
	return len[st];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -