题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777

Time Limit: 2 Seconds      Memory Limit: 65536 KB

The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effect on the result of the contest. For example, it will take more time to finish the first problem if the easiest problem hides in the middle of the problem list.

There are N problems in the contest. Certainly, it's not interesting if the problems are sorted in the order of increasing difficulty. Edward decides to arrange the problems in a different way. After a careful study, he found out that the i-th problem placed in the j-th position will add Pij points of "interesting value" to the contest.

Edward wrote a program which can generate a random permutation of the problems. If the total interesting value of a permutation is larger than or equal to M points, the permutation is acceptable. Edward wants to know the expected times of generation needed to obtain the first acceptable permutation.

Input

There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:

The first line contains two integers N (1 <= N <= 12) and M (1 <= M <= 500).

The next N lines, each line contains N integers. The j-th integer in the i-th line is Pij (0 <= Pij <= 100).

Output

For each test case, output the expected times in the form of irreducible fraction. An irreducible fraction is a fraction in which the numerator and denominator are positive integers and have no other common divisors than 1. If it is impossible to get an acceptable permutation, output "No solution" instead.

Sample Input

2
3 10
2 4 1
3 2 2
4 5 3
2 6
1 3
2 4

Sample Output

3/1
No solution

题意:

有n个题目,按从简单到难,若把第i难的题目放到第j个位置,会产生P[i][j]的“有趣度”;

现在有一个随机产生这n个题目排列的程序,若一个排列它的所有题目有趣度之和大于等于m,则算作满足要求;

求产生一个满足要求的题目排列的期望次数。

题解:

状压DP做法:state是一个n位的二进制数,每一位 1 or 0 代表了该位置是否被占掉了;

假设dp[state][k]代表:前i道题的放置情况按state安排,产生有趣度为k的方案数;

状态转移:

  若要计算cnt道题目按state安排情况下,dp[state][k]的值(所有有趣度k>m的方案都算在k=m里),则:

  从state里去掉一道题目,假设去掉的是放在第i个位置上的那道题目,得到new_state(这个new_state必然小于state),

  再枚举k=0~m,dp[state][(k+p[cnt][i])] += dp[new_state][k],同样记得把所有有趣度k>m的方案都算到k=m里。

正确性:

当state=0时,即初始dp[0][0]为1,dp[0][1~m]都为0,这是正确的,故可以从state=1开始状态转移;

同时,正如前面说的new_state必然小于state,我们从小到大枚举state,那么计算state时所有new_state都必然已经计算好了。

AC代码:

#include<bits/stdc++.h>
using namespace std; int n,m;
int p[][];
int dp[<<][]; inline int gcd(int m,int n){return n?gcd(n,m%n):m;} int fact[];
void calcfact()
{
fact[]=;
for(int i=;i<=;i++) fact[i]=fact[i-]*i;
} int main()
{
calcfact(); int t;
scanf("%d",&t);
memset(p,,sizeof(p));
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) for(int j=;j<=n;j++) scanf("%d",&p[i][j]); memset(dp,,sizeof(dp));
dp[][]=;
for(int sta=;sta<(<<n);sta++) //遍历所有状态
{
int cnt=; //cnt表示已经安排好了cnt道题目
for(int i=;i<=n;i++) if(sta&(<<(i-))) cnt++; for(int i=;i<=n;i++)
{
if( ( sta & (<<(i-)) ) == ) continue; for(int k=;k<=m;k++)
{
if(k+p[cnt][i]>=m) dp[sta][m]+=dp[sta^(<<(i-))][k];
else dp[sta][k+p[cnt][i]]+=dp[sta^(<<(i-))][k];
}
}
} if(dp[(<<n)-][m]==)
{
printf("No solution\n");
continue;
} int down=dp[(<<n)-][m];
int up=fact[n];
int g=gcd(up,down);
printf("%d/%d\n",up/g,down/g);
}
}

时间复杂度O(n2)+O(2nmn)+O(lg(n!)),显然在数据较大时,主要影响项是O(2nmn),根据数据规模(2^12)*12*500 ≈ 2e7,足够。

PS.自从上次做状压DP专题之后,很久没有再做状压DP的题目了,发现自己对状压DP的理解还是不够深刻,而且忘记地也很快,需要复习巩固。

ZOJ 3777 - Problem Arrangement - [状压DP][第11届浙江省赛B题]的更多相关文章

  1. ZOJ 3780 - Paint the Grid Again - [模拟][第11届浙江省赛E题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 Time Limit: 2 Seconds      Me ...

  2. zoj3777 Problem Arrangement(状压dp,思路赞)

    The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward i ...

  3. ZOJ 3777 B - Problem Arrangement 状压DP

    LINK:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:有N(\( N <= 12 \))道题,排顺序 ...

  4. zoj 3777 Problem Arrangement(壮压+背包)

    Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial C ...

  5. 2014 Super Training #4 B Problem Arrangement --状压DP

    原题:ZOJ 3777  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777 题意:给每个题目安排在每个位置的value ...

  6. ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds      Me ...

  7. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  8. zoj 3777 Problem Arrangement

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意:给出n道题目以及每一道题目不同时间做的兴趣值,让你求出所有做题顺序 ...

  9. ZOJ 3723 (浙大月赛)状压DP

    A了一整天~~~终于搞掉了. 真是血都A出来了. 题目意思很清楚,肯定是状压DP. 我们可以联系一下POJ 1185  炮兵阵地,经典的状压DP. 两道题的区别就在于,这道题的攻击是可以被X挡住的,而 ...

随机推荐

  1. spring + Mybatis + pageHelper + druid 整合源码分享

    springMvc + spring + Mybatis + pageHelper + druid 整合 spring 和druid整合,spring 整合druid spring 和Mybatis  ...

  2. Java Cookie工具类,Java CookieUtils 工具类,Java如何增加Cookie

    Java Cookie工具类,Java CookieUtils 工具类,Java如何增加Cookie >>>>>>>>>>>>& ...

  3. systemctl命令完全指南

    Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器. Systemd是一个系统管理守护进程.工具和库的集合,用于取代System V初始进程.Systemd的功能是 ...

  4. Linux应急响应(三):挖矿病毒

    0x00 前言 ​ 随着虚拟货币的疯狂炒作,利用挖矿脚本来实现流量变现,使得挖矿病毒成为不法分子利用最为频繁的攻击方式.新的挖矿攻击展现出了类似蠕虫的行为,并结合了高级攻击技术,以增加对目标服务器感染 ...

  5. WAF Bypass FUZZ小脚本

    分享两个小脚本,用来WAF Bypass简单FUZZ的 第一个:先生成一个字典,带入搭建的环境进行FUZZ,针对某些软WAF挺好用的,可FUZZ出不少姿势出来,记得先把CC攻击加入白名单才行哦... ...

  6. Ansible 实战:一键安装 LNMP

    Ansible 配置文件 : [root@center /data/ansiblework]# cat ansible.cfg [defaults] remote_user = root remote ...

  7. Kafka配置SSL(云环境)

    本文结合一个具体的实例给出如何在公有云环境上配置Kafka broker与client之间的SSL设置. 测试环境 阿里云机一台(Server端):主机名是kafka1,负责运行单节点的Kafka集群 ...

  8. 深入浅出MFC——Document-View深入探讨(五)

    1. MFC之所以为Application Framework,最重要的一个特征就是它能够将管理数据的程序代码和负责数据显示的程序代码分离开来,这种能力由MFC的Document/View提供.Doc ...

  9. 使用kendynet构建异步redis访问服务

    使用kendynet构建异步redis访问服务 最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用stri ...

  10. 【EF框架】使用params参数传值防止SQL注入报错处理

    通过SqlParameter传时间参数,代码如下: var param = new List<SqlParameter>(); param.Add(new SqlParameter(&qu ...