社区
数据结构与算法
帖子详情
去相邻的排列组合题 【有点难】
wyl1267
2010-05-05 09:17:58
此题看似简单,其实有点难度,解题方法不限(用程序或数学推导均可)
1 1 2 2 3 3 4 4 5 5 组成一个十位数,相同的不能相邻,有多少种排法?
...全文
403
30
打赏
收藏
去相邻的排列组合题 【有点难】
此题看似简单,其实有点难度,解题方法不限(用程序或数学推导均可) 1 1 2 2 3 3 4 4 5 5 组成一个十位数,相同的不能相邻,有多少种排法?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
30 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
寒果
2010-05-26
打赏
举报
回复
应该是10*8!=403200
jinhaize
2010-05-25
打赏
举报
回复
mark
wyl1267
2010-05-11
打赏
举报
回复
#26楼的程序很精简,可没有注释,读起来挺费劲,能解释一下吗?
谢谢!
Sunday
2010-05-08
打赏
举报
回复
结果是:
39480
Press any key to continue
程序如下:
#include<iostream>
using namespace std;
int a[11]={1,1,2,2,3,3,4,4,5,5};
int b[10];
#define N 10
int num()
{
int i,j,g;int sum=0;
b[0]=0;i=0;
while(1)
{
g=1;
for(j=i-1;j>=0;--j)
if(b[j]==b[i])
g=0;
if(i>0&&a[b[i]]==a[b[i-1]])g=0;
if(i==N-1&&g)
{
sum++;
for(j=0;j<N;++j)
printf( "%d ",a[b[j]]);
cout<<endl;
}
if(i<N-1&&g){i++;b[i]=0;continue;}
while(b[i]==9)i--;
if(i<0)break;
else b[i]++;
}
return sum/32;
}
int main()
{
cout<<num()<<endl;
return 0;
}
Sunday
2010-05-08
打赏
举报
回复
http://acm.hdu.edu.cn/showproblem.php?pid=1030
Arucart
2010-05-07
打赏
举报
回复
验证了下。。。的确是39480
yyfhz
2010-05-07
打赏
举报
回复
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
这个是对的,我之前的递推公式有错,NC了。
这个利用了集合的容斥性原理。简单的讲,假设有两个集合A和B,它们的面积分别为S(A)和S(B),则
S(A∪B)= S(A)+S(B)- S(A∩B)
================================================================
现在要证明对于任意n个集合{Ai|i=1...n),都有
S(∪Ai|i=1..n)=-∑S(∩{At|t=1..n},i)*(-1)^i, i=1..n
这里的∑S(∩{At|t=1..n},i)是一种写法,表示从A1,...,An个集合中任意抽取i个元素做交集,再把这些交集的面积加起来。
利用归纳法。
当n=2时,
S(A1∪A2)=S(A1)+S(A2)- S(A1∩A2)= -∑S(∩{At|t=1..2},1)*(-1)^1 -∑S(∩{At|t=1..2},2)*(-1)^2
当n=3时,
S(A1 ∪ A2 ∪ A3)
= S(A1∪A2)+S(A3)-S( (A1∪A2) ∩ A3)
= S(A1∪A2)+S(A3)-S((A1∩A3)∪(A2∩A3))
= S(A1)+S(A2)-S(A1∩A2)+S(A3)-[ S(A1∩A3) + S(A2∩A3) - S((A1∩A3)∩(A2∩A3))]
= S(A1)+S(A2)+S(A3)-S(A1∩A2)-S(A2∩A3)-S(A1∩A3)+S(A1∩A2∩A3)
= ∑S({A1,A2,A3},1)-∑S({A1,A2,A3},2)+∑S({A1,A2,A3},3)
= -∑S(∩{At|t=1..3},i)*(-1)^i, i=1..3
现假设n=k时成立,即有
S(∪Ai|i=1..k)=-∑S(∩{At|t=1..k},i)*(-1)^i, i=1,...,k)
则当n=k+1时,有
S(∪Ai| i=1..k+1)
= S((∪Ai|i=1..k)∪Ak+1)
= S(∪Ai|i=1..k)+S(Ak+1)-S((∪Ai|i=1..k)∩Ak+1)
= [-∑S(∩{At|t=1..k},i)*(-1)^i, i=1..k] + S(Ak+1) - S(∪(Ai∩Ak+1)|i=1..k)
= [-∑S(∩{At|t=1..k},i)*(-1)^i, i=1..k] + S(Ak+1) - [-∑S(∩{At∩Ak+1|t=1..k},i)*(-1)^i, i=1..k]
= ∑S(∩{At|t=1..k},1) + S(Ak+1) +[-∑S(∩{At|t=1..k},i)*(-1)^i, i=2..k]+∑S(∩{At∩Ak+1|t=1..k},i)*(-1)^i, i=1..k-1]+∑S(∩{At∩Ak+1|t=1..k},k)*(-1)^k .........(1)
注意到
① ∑S(∩{At|t=1..k},1)= ∑S(At), t=1..k ,因此有 ∑S(∩{At|t=1..k},1) + S(Ak+1)=∑S(At), t=1..k+1=∑S(∩{At|t=1..k+1},1)=-∑S(∩{At|t=1..k+1},1)*(-1)^1
② [∑S(∩{At∩Ak+1|t=1..k},i)*(-1)^i, i=1..k-1] = -[∑S(∩{At∩Ak+1|t=1..k},i-1)*(-1)^i, i=2..k]
③ -∑S(∩{At|t=1..k},i)*(-1)^i, i=2..k] - [∑S(∩{At∩Ak+1|t=1..k},i-1)*(-1)^i, i=2..k]=-∑S(∩{At|t=1..k+1},i)*(-1)^i, i=2..k]
④ ∑S(∩{At∩Ak+1|t=1..k},k)*(-1)^k= -∑S(∩{At∩Ak+1|t=1..k},k)*(-1)^(k+1)=-∑S(∩{At|t=1..k+1},k+1)*(-1)^(k+1)
因此(1)=-∑S(∩{At|t=1..k+1},1)*(-1)^1 -∑S(∩{At|t=1..k+1},i)*(-1)^i, i=2..k] -∑S(∩{At|t=1..k+1},k+1)*(-1)^(k+1)
= -∑S(∩{At|t=1..k+1},i)*(-1)^i, i=1..k+1
证毕。
===============================================
在本题中,其实可以取k=5 ,对应的集合Ai则表示数字i在整个字符串中连续出现的情况,要求S(∪Ai|i=1..5)。最后让全集10!/2^5减去S(∪Ai|i=1..5)即可,结果就是14楼的式子
wyl1267
2010-05-07
打赏
举报
回复
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
请哪位高手写个程序,验证此结果.
michael122
2010-05-06
打赏
举报
回复
第一项是全排列,第二项是减去有1对相邻的,但是多减了2对相邻的,第三项加回来。。。
这是离散数学里面的知识,上面的只是直观的分析,需要严格证明
LeonTown
2010-05-06
打赏
举报
回复
没看明白,
能给解释一下吗。。。
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
rolim
2010-05-06
打赏
举报
回复
类似八皇后问题 ?
xinzaiyiqi
2010-05-05
打赏
举报
回复
[Quote=引用 3 楼 flying_sb 的回复:]
先求全排列,再将相同相邻的排列减掉
[/Quote]
也是这个感觉
flying_sb
2010-05-05
打赏
举报
回复
先求全排列,再将相同相邻的排列减掉
lz3771
2010-05-05
打赏
举报
回复
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
容斥原理的应用加上可重复排列
michael122
2010-05-05
打赏
举报
回复
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
此乃正解,赞!
LeonTown
2010-05-05
打赏
举报
回复
我初步感觉是:
(C(5,1)*C(4,1)) * (C(4,1)*C(3,1)) * (C(3,1)*C(2,1)) * (C(2,1)*C(1,1))
yyfhz
2010-05-05
打赏
举报
回复
好像是得用递归的方法~~。先把问题扩充为:有N组不同的字符,每组都由2个同样的字符组成。现在将这N组字符构成2N长度的字符串。问可构成多少种相邻字符不同的字符串?
=============================================
先定义两个函数F(X)和G(X),F(X)表示由X组相同的字符相邻所组成的字符串的数量;G(X)表示由至少X组相同的字符相邻所组成的字符串。
================================================
X=N:
显然,F(N)=C(N,N)*N!*2^N/2^N,
G(N)=F(N)
X=N-1:
F(N-1)=C(N-1,N)*(N-1+2N-2(N-1))!*2^(N-1)/2^N - C(N-1,N)*G(N)
=C(N-1,N)*[(N+1)!/2^1 -G(N)]
G(N-1)=F(N-1)+G(N)
...
X=N-i
F(N-i)= C(N-i,N)*(N-i+2N-2(N-i))!*2^(N-i)/2^N - C(N-i,N)*G(N-i+1)
= C(N-i,N)*[(N+i)!/2^i - G(N-i+1)]
G(N-i)= F(N-i)+G(N-i+1)
...
X=1=N-(N-1)
F(1) = C(N-(N-1),N)*[(N+(N-1))!/2^(N-1) - G(2)]
= C(1,N)*[(2N-1)!/2^(N-1) - G(2)]
G(1) = F(1)+G(2)
X=0
F(0) = C(0,N)*[2N!/2^N - G(1)]
完毕
kenyyy
2010-05-05
打赏
举报
回复
就针对这个数据的话可以用程序解出来,要是数据量大一点就不知道了。。。有些难。。。还没想到。。。
flying_sb
2010-05-05
打赏
举报
回复
n=1,f(n)=0;
n=2,f(n)=2;
n>=3,f(n)=f(n-1)*C(2n+1,2)+f(n-2)*(n-1)*C(2n-3,1)*C(2n-3,1)+f(n-3)*1*C(n-1,2)
递归,拿掉最后一组,剩下的可能是有一组相同相邻,也可能有两组相同相邻,也可能没有
绿色夹克衫
2010-05-05
打赏
举报
回复
恩,这个感觉应该是可以的,没有验证。
[Quote=引用 14 楼 zeroieme 的回复:]
=10!/(2^5)-9!*C(5,1)/(2^4)+8!*C(5,2)/(2^3)-7!*C(5,3)/(2^2)+6!*C(5,4)/(2^1)-5!
=39480
[/Quote]
加载更多回复(10)
微信小程序界面设计-小程序中的WXSS(css)选择器
讲解微信小程序中如何使用css选择器,哪些选择器支持哪些选择器不支持,讲解选择器分组,属性选择器,后代选择器,子元素和
相邻
兄弟选择器,伪类选择器,伪元素选择器,微信小程序中样式css选择器等
排列组合
概率
题
解
题
技巧
排列组合
概率
题
解
题
技巧有哪些?怎么样解决这类问
题
?下面是小编为大家整理的关于
排列组合
概率
题
解
题
技巧,希望对您有所帮助。欢迎大家阅读参考学习!
排列组合
概率
题
解
题
技巧 1.排列、组合、概率与错位公式 2.
排列组合
概率解
题
思路——分类法 3.例
题
1:繁琐的计算导致正确率变低 4.例
题
2:通过选项思考暴力的可能性 5.例
题
3:极为简单,一半做错的
题
6.例
题
4:分不同情况考虑安排方案 7.例
题
5:分不同情况考虑安排方案 8.例
题
6:理解
排列组合
题
的关键 一、排列、组合、概率与错位公式 「数量关系」板块中的「排列、
排列组合
公式及
排列组合
算法
排列组合
公式
排列组合
公式/
排列组合
计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元素取M个进行组合,不进行排列。 N-元素的总个数 M参与选择的元素个数 !-阶乘,如 9!=9*8*7*6*5*4*3*2*1 从N到数M个,表达式应该为n*(n-1)*(n-2)..(n-m+1); 因为从n到(
排列组合
数学的
相邻
问
题
(插空法-捆绑法-隔板法)
主要解决
相邻
或者不
相邻
问
题
插空法(处理不
相邻
问
题
) 插空法就是对于解决 某几个元素要求不
相邻
的问
题
时,先将其他元素排好,再将所指定的不
相邻
的元素插入它们的间隙或两端位置。首要特点就是不
相邻
。 例
题
1: 把1,2,3,4,5组成没有重复数字且数字 1,2不
相邻
的五位数,则所有不同排法有多少种? 解析:本
题
直接解答较为麻烦,因为可先将 3,4,5三个元素排定,共有A(3,3)种排法,然后再将 1,...
leetcode 面试
题
08.08. 有重复字符串的
排列组合
面试
题
08.08. 有重复字符串的
排列组合
有重复字符串的
排列组合
。编写一种方法,计算某字符串的所有
排列组合
。 示例1: 输入:S = “qqe” 输出:[“eqq”,“qeq”,“qqe”] 示例2: 输入:S = “ab” 输出:[“ab”, “ba”] 提示: 字符都是英文字母。 字符串长度在[1, 9]之间。 记录了三种方法: 1.建立一个记录表,在每次回溯的时候查看当前字符是否被使用过 2.每次回溯的时候就减去使用过的字符,不用建表 3.对字符串进行排序,如果两个字符相同,就使用剪枝,跳过放前循
数据结构与算法
33,010
社区成员
35,328
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章