题目链接: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 mvc处理方法返回方式

    Model: package org.springframework.ui; import java.util.Collection; import java.util.Map; public int ...

  2. str.split()与re.split()的区别

    str.split(): >>>'hello, world'.split() >>>['hello,','world'] >>>'hello, w ...

  3. JavaWeb学习总结(十五)Jsp中提交的表单的get和post的两种方式

    两者的比较: Get方式: 将请求的参数名和值转换成字符串,并附加在原来的URL之后,不安全 传输的数据量较小,一般不能大于2KB: post方式: 数量较大: 请求的参数和值放在HTML的请求头中, ...

  4. 教你在windows下安装使用配置vim+gcc[转]

    转自http://blog.163.com/lixiangqiu_9202/blog/static/535750372012461190722/ 一直在使用linux,但有时也会去虚拟机里的winxp ...

  5. Mac下Intellij IDea发布JavaWeb项目 详解二 (新建Module)

    Step3 添加两个module 3.1 右键[WebWorkSpace]-[New]-[Module] 3.2 重复 准备工作1:新建第一个JavaWeb项目[1.6-1.11]的操作,建好一个名为 ...

  6. c# linq update单个字段

    1.更新单个字段 /// <summary> /// 更新字段 /// </summary> /// <typeparam name="T">& ...

  7. URL域名获取

    http://"是协议名 "www.test.com"是域名 "是端口号 "aaa"是站点名 "bbb.aspx"是页面 ...

  8. delphi for android 获取手机号

    delphi for android 获取手机号 uses   System.SysUtils, System.Types, System.UITypes, System.Classes, Syste ...

  9. c++ 纯虚析构函数

    ; 这就是一个纯虚析构函数,这种定义是允许的. 一般纯虚函数都不允许有实体,但是因为析构一个类的过程中会把所有的父类全析构了,所以每个类必有一个析构函数. 所以.纯虚析构函数需要提供函数的实现,而一般 ...

  10. Promise 必知必会的面试题

    Promise 想必大家都十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?本文根据 Promise 的一些知识点总结了十道题,看看你能做对几道. 以下 promise 均指代 P ...