站外题 彩球问题
  • 板块学术版
  • 楼主ElmPoplar
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/6/22 19:50
  • 上次更新2023/10/27 22:48:46
查看原帖
站外题 彩球问题
371524
ElmPoplar楼主2022/6/22 19:50

nn种颜色的小球,其中第ii种颜色的小球有kik_i个。将这些小球从左到右排成一行,使得相同颜色的小球不相邻,求有多少种方案。

相同颜色的小球之间没有区别,经过翻转等任意操作后才相同的两种方案算作不同的方案。 输入

第一行一个正整数NN,表示颜色种类数。

第二行NN个正整数kik_ikik_i表示第i种颜色的数量(1 ≤ kik_i ≤ 3)。 输出

一个整数,表示相同颜色的小球不相邻的方案数。

样例

输入1

3
1 2 3

输出1

10

输入2

4
1 3 2 1

输出2

96

输入的所有数字均为正整数。

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int n, m, k[N], path[N * 3];
int ans = 0;

void dfs(int step) {
	if (step == m + 1) {
		ans ++;
//		for (int i = 1; i <= m; i ++)
//			printf("%d ", path[i]);
//		printf("\n");

		return ;
	}

	for (int i = 1; i <= n; i ++) {
		if ((path[step - 1] == i && step != 1) || ! k[i])
			continue;

		path[step] = i;
		k[i] --;
		dfs(step + 1);
		k[i] ++;
	}
}

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++) {
		scanf("%d", &k[i]);
		m += k[i];
	}

	dfs(1);

	printf("%d\n", ans);

	return 0;
}

TLE了,求大神时间优化或者剪枝

2022/6/22 19:50
加载中...