题意

一个大小为 \(n*m\) 的棋盘,知道每一列放了多少棋子,求有多少摆放方案满足要求。

\(n,m\leq 50\) .

分析

  • 如果是求是否有方案的话可以考虑网络流,行列连边,列容量为 \(b_j\),行容量为 \(m\) 。

  • 考虑转化成一个最小割问题,假设\(S\rightarrow row\) 有 \(i\) 条边,\(column \rightarrow T\) 有 \(j\) 条边,中间显然要断开 \((n-i)*(m-j)\)条边。在这样的情况下左边和右边的边一定是前 \(i\) 小和前 \(j\) 小的边。

  • 发现只要最后 \(\sum{a_i}=\sum{b_i}\) ,且对于排序后的 \(a\) 任意的 \(i\) 满足\(s_i=\sum_{k=1}^{i}{a_i}\) 都比其下限大就一定是合法方案。

  • 下限 \(low\):\(s_i\) 在所有的 \(j\) 的情况下的最大值。如果小于下限就会出现比 \(\sum{b_i}\) 还要小的割,不符合题意。

  • 考虑定义状态 \(f_{i,j,k}\) 表示权值不超过 \(i\),选了 \(j\) 行,和为 \(j\) 的方案数。

  • 转移枚举 \(i\) 选择了 \(x\) 个,然后在剩下的行中选择 \(x\) 行的方案数为 \(\binom{n-j}{x}\) ,要保证对于 \(p\in [0,x]\),有 \((k+p*x)\geq {low}_{j+p}\)

  • 总时间复杂度为 \(O(n^3m^2)\)。

代码

#include<bits/stdc++.h>
using namespace std;
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
typedef long long LL;
inline int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
return x*f;
}
template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
const int N=54,inf=0x3f3f3f3f,mod=1e9 + 7;
int n,m,sum;
int b[N],a[N],c[N][N],f[N][N][N*N];
void add(int &a,int b){a+=b;if(a>=mod) a-=mod;}
int main(){
n=gi(),m=gi();
rep(i,1,m) b[i]=gi(),sum+=b[i];
sort(b+1,b+1+m);
rep(i,1,m) b[i]+=b[i-1]; rep(i,1,n){
int tmp=inf;
rep(j,1,m) Min(tmp,(n-i)*(m-j)+b[j]);
a[i]=sum-tmp;
}
rep(i,0,n){
c[i][0]=1;
rep(j,1,i) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
} f[0][0][0]=1;
rep(i,0,m)
rep(j,0,n)
rep(k,0,sum){
for(int v=0;j+v<=n&&k+i*v<=sum;++v){
if(a[j+v]>k+i*v) break;
add(f[i+1][j+v][k+i*v],1ll*f[i][j][k]*c[n-j][v]%mod);
}
}
printf("%d\n",f[m+1][n][sum]);
return 0;
}

Wannafly挑战赛26-F-msc的棋盘[最小割转化dp]的更多相关文章

  1. Codeforces 724E Goods transportation(最小割转DP)

    [题目链接] http://codeforces.com/problemset/problem/724/E [题目大意] 每个城市有pi的物品可以运出去卖,si个物品可以买, 编号小的城市可以往编号大 ...

  2. Wannafly挑战赛26-F. msc的棋盘(模型转化+dp)及一类特殊的网络流问题

    题目链接 https://www.nowcoder.com/acm/contest/212/F 题解 我们先考虑如果已知了数组 \(\{a_i\}\) 和 \(\{b_i\}\),如何判断其是否合法. ...

  3. BZOJ 1001 狼抓兔子 (最小割转化成最短路)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 27715  Solved: 7134[Submit][ ...

  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E - Goods transportation 最大流转最小割转dp

    E - Goods transportation 思路:这个最大流-> 最小割->dp好巧妙哦. #include<bits/stdc++.h> #define LL long ...

  5. bzoj 1001 原图最小割转化为对偶图最短路

    题目大意: 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形 ...

  6. Atcoder Regular Contest 125 E - Snack(最小割转化+贪心)

    Preface: 这是生平第一道现场 AC 的 arc E,也生平第一次经历了 performance \(\ge 2800\)​,甚至还生平第一次被 hb 拉到会议里讲题,讲的就是这个题,然鹅比较尬 ...

  7. [Wannafly挑战赛28][B msc和mcc][预处理+枚举]

    链接:https://ac.nowcoder.com/acm/contest/217/B来源:牛客网 msc和mcc 题目描述 msc和mcc是一对好朋友,有一天他们得到了一个长度为n的字符串s. 这 ...

  8. Wannafly挑战赛26 B 冥土追魂

    首先,证明结果一定是取某些整行,再加上一个多余的一行的前几个. 假如: x1<=x2<=x3<=x4<=x5 y1<=y2<=y3<=y4<=y5 取6 ...

  9. Wannafly挑战赛26题解

    为啥混进了几道不是魔禁的题--出题人太不敬业了-- 传送门 \(A\) 御坂网络 为啥没有番外个体和整体意志呢 暴力模拟就好了,这个要是都打错我干脆滚回去学文化课算了 //minamoto #incl ...

随机推荐

  1. CSS实现DIV从隐藏到展示的过渡效果

    CSS中有很多功能强大的方法,其中过渡属性transition就很牛叉.你不用写一行JavaScript代码,随便写点css就可以实现一个动画效果.下面结合我在W3C网站上看到的实例,举个栗子说明下( ...

  2. python生成式和生成器

    一,生成式和生成器 1,列表生成式 mylist = [ i*i for i in range(3) if i>1 ] print(mylist) 运行结果:[4] 可以发现,快速生成列表的表达 ...

  3. 【转】Java学习---Java中volatile关键字实现原理

    [原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.c ...

  4. Redis学习---面试基础知识点总结

    [学习参考] https://www.toutiao.com/i6566017785078481422/ https://www.toutiao.com/i6563232898831352323/ 0 ...

  5. scss 使用

    SCSS 常用功能 https://www.cnblogs.com/guangzan/p/10547335.html 定义变量$my-color: #666; //定义变量$my-heihgt: 10 ...

  6. 51nod 贪心算法题集

    2070 最小罚款: 题意:初始有n元,每个任务有2个参数:t和w,<=t时刻前完成任务才可避免造成损失w.问:如何安排才能尽可能避免损失?一个任务执行时间是一个单位时间. 分析:任务按时间排个 ...

  7. 使用ubuntu过程中遇到的问题汇总

    使用ubuntu过程中遇到的问题汇总 1.使用图形界面设置免密码登录之后,改回密码登陆失效 解决方案: https://askubuntu.com/questions/211084/how-do-i- ...

  8. header头

    <?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...

  9. Kafka学习之路 (五)Kafka在zookeeper中的存储

    一.Kafka在zookeeper中存储结构图 二.分析 2.1 topic注册信息 /brokers/topics/[topic] : 存储某个topic的partitions所有分配信息 [zk: ...

  10. Drool实战系列(二)之eclipse安装drools插件

    这里演示是drools7.5.0,大家可以根据自己需要安装不同的drools版本 drools安装地址: http://download.jboss.org/drools/release/ 一. 二. ...