题目中需要对0-8九个数的全排列计数(字典序),来完成一张对于的HASH表,显然状态空间中共有9!个状态,可以看成一颗树,第一层9个子节点,第二层每个节点8个子节点,第三层每个节点7个子节点,以此类推。
那么对于某中特定的排列,要求它的字典计数,只需求出每一层在该点之后的节点个数乘以该层对应的DP项。。。
int dp[10]={1,1,2,6,24,120,720,5040,40320,362880};
int getHash(int code[9])
{
int sum=0;
bool flag[9];
int k;
memset(flag,false,sizeof(flag));
for(int i=0;i<9;++i)
{
k=0;
for(int j=code[i]+1;j<9;++j)
{
if(!flag[j])
++k;
}
sum+=k*dp[8-i];
flag[code[i]]=true;
}
return 362879-sum;
}
void test(bool flag[9],int b,int num[9])
{
if(b>8)
{
printf("%d\n",getHash(num));
return;
}
for(int i=0;i<9;++i)
{
if(!flag[i])
{
flag[i]=true;
num[b]=i;
test(flag,b+1,num);
flag[i]=false;
}
}
}
int main()
{
bool ff[9];
int nn[9];
memset(ff,false,sizeof(ff));
memset(nn,false,sizeof(nn));
test(ff,0,nn);
int a[9]={0,1,2,3,4,5,6,7,8};
int b[9]={8,7,6,5,4,3,2,1,0};
printf("%d\n",getHash(b));
}
代码中test函数枚举所有9!种全排列测试正确性
分享到:
相关推荐
最近在acm.zju.edu.cn上通过的题目的代码,都是比较有价值的题目
zoj吐血制作,希望大家喜欢
zoj网站中多个练习的c++解答,文件名即为题目序号。经本人测试可以使用,主要为动态规划方面的问题,希望给初学者提供帮助。
这是一份ZOJ的ACM题解,包含大多数题目的AC程序,是学习算法的好东西~
zoj在线评测系统前台和后台源代码,包括比赛用的客户端源代码
ZOJ 1055 Oh, Those Achin Feet.bfs求最短路径.
zoj4041正确题解源代码,以及运行程序
浙江大学ZOJ源码题解,按照题目类型和难易分类。
acm中zoj1002的可运行C++程序
问题:枫教授在一所大学教数学,他发现了一个函数,用于获得一个表达式的操作数的目的,函数命名op(i,e)可以描述如下:
一个非常非常非常非常实用的zoj结题代码
zoj的代码实现,很好,而且很全面,全部实现。
zoj_1004.cpp 求单词字母进出栈后能形成目标串的进出方案 广度优先搜索求解
ZOJ上的一些水题,4.16浙江省程序设计竞赛的题目
zoj 2536 这个不是用贪心做的
浙大acm OJ1204,自己做的,已经AC 分享一下,若有更好的算法可以教教我
zoj上的3607Lazier Salesgirl AC代码及一些注释。贪心算法
能AC 通过的c++代码,包括zoj1002,1091,1789
浙江大学zoj题目代码,大量水题代码,齐全
ZOJ解题报告ZOJ解题报告ZOJ解题报告ZOJ解题报告