51Nod1231 记分牌 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1231.html
题目传送门 - 51Nod1231
题意

题解
显然是一个竞赛图相关的题。
我们首先证明一个结论:
一个出度序列存在对应的 $n$ 个点的竞赛图的充分必要条件是:这个出度序列的所有元素之和为 $\cfrac{n(n-1)}{2}$ ,且 对于这个出度序列中任意 $k$ 个元素,满足他们的和 $\geq \cfrac{k(k-1)}{2}$ 。
由于我懒得写证明(证明需要用构造法,自行百度),这个结论的证明略去。
于是我们只需要保证最终的出度序列的总和为 $\cfrac{n(n-1)}{2}$ ,并且将其排序后,对于所有 $k \in [1,n]$ ,前 $k$ 个元素之和 $\geq \cfrac{k(k-1)}2$ 即可。
我们按照数值从小到大填。
我们令 $dp[i][j][k]$ 表示前 $i$ 个数,当前最后一个数为 $j-1$ ,前 $i$ 个数的总和为 $k$ 的方案总数。然后大力 DP 即可。
dp 复杂度的上限是 $O(n^5)$ 的,但是由于有很多无用的状态,所以 20 组数据仍然可以跑过去。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=45,mod=1e9+7;
int T,n,a[N],C[N][N],dp[N][N][N*N],cnt[N],tot[N];
int calc(int x){
return x*(x-1)/2;
}
void add(int &x,int y){
x+=y;
if (x>=mod)
x-=mod;
}
int solve(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
memset(cnt,0,sizeof cnt);
for (int i=1;i<=n;i++)
if (a[i]>=0)
cnt[a[i]]++;
memset(tot,0,sizeof tot);
for (int i=n;i>=0;i--)
tot[i]=tot[i+1]+cnt[i];
memset(dp,0,sizeof dp);
dp[0][0][0]=1;
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
for (int k=0;k<=calc(n);k++){
int v=dp[i][j][k];
if (!v)
continue;
for (int t=0;i+t<=n-tot[j+1];t++){
int _k=k+t*j;
if (_k>calc(n)||calc(i+t)>_k)
break;
if (t<cnt[j])
continue;
add(dp[i+t][j+1][_k],1LL*v*C[n-i-tot[j]][t-cnt[j]]%mod);
}
}
int ans=0;
for (int i=0;i<=n;i++)
add(ans,dp[n][i][calc(n)]);
return ans;
}
int main(){
for (int i=0;i<N;i++)
C[i][0]=C[i][i]=1;
for (int i=1;i<N;i++)
for (int j=1;j<i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
scanf("%d",&T);
while (T--)
printf("%d\n",solve());
return 0;
}
/*
dp[i][j][k]表示前 i 个数,最后一个数是 j , 所有数的总和为 k 的序列总数
dp[i+t][j+1][k+t*j]+=C[n-i][t]*dp[i][j][k]
j<n,i+t<=n
k+t*j<=n*(n-1)/2
forall t' in [0,t] , (i+t')*(i+t'-1)/2<=k+t*j
*/
51Nod1231 记分牌 动态规划的更多相关文章
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- 【体系结构】动态调度算法:记分牌算法和tomasulo算法
记分牌和tomasulo算法 动态调度: 通过硬件在程序执行时重新安排代码的执行序列来减少竞争引起的流水线停顿时间 动态调度流水线具备以下功能: (1)允许按序取多条指令和发射多条指令----取指(I ...
- 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划
[BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...
随机推荐
- wireshark找(检测)不到(捕获)网卡的解决办法
1 前言 有时候打开wireshark,会提示找不到可用网卡,此时是因为NetGroup Packet Filter Driver 服务没有开启. 环境:笔记本 系统:Win10 网络:WIFI 2 ...
- 6)协程三( asyncio处理并发)
一:使用 asyncio处理并发 介绍 asyncio 包,这个包使用事件循环驱动的协程实现并发.这是 Python 中最大也是最具雄心壮志的库之一. 二:示例 1)单任务协程处理和普通任务比较 #普 ...
- 洛谷P4336 [SHOI2016]黑暗前的幻想乡 [Matrix-Tree定理,容斥]
传送门 思路 首先看到生成树计数,想到Matrix-Tree定理. 然而,这题显然是不能Matrix-Tree定理硬上的,因为还有每个公司只能建一条路的限制.这个限制比较恶心,尝试去除它. 怎么除掉它 ...
- Windows服务启动进程----Cjwdev.WindowsApi.dll
windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...
- Confluence 6 附件是如何被索引的
当一个文件被上传到 Confluence 后,Confluence 将会尝试对文件进行解压,然后对文件中的内容进行索引.这样系统就能够允许用户对文件中的内容进行搜索,而不仅仅是搜索文件名.这个过程对系 ...
- 【Java】「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势
0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有 ...
- vue三大框架
vue 前端三大新框架: Angular.js------Google研发 缺点: 学习成本高.最早研发 严谨 React.js facebook.com (脸书)自主研发 开源 j ...
- 将Maven项目打包成可执行jar文件(引用第三方jar)
方法一. mvn assembly 或 mvn package (一个jar包) 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> ...
- PHP中json_encode()使用须知,JSON数组和JSON对象
⊰ 偷偷的告诉你,这是一个很不谨慎就会踩得坑 ⊱ 如下代码 (看了一下很简单,没毛病啊,老铁) $arr = array( '0'=>'a','1'=>'b','2'=>'c',' ...
- WampServer & XAMPP Configure with MariaDB and MySQL
第一部分补上次的一个问题 1.WampServer 3不支持的硬件格式 FAT3和 exFAT 他只能工作在NTFS的格式硬盘上. 不能在Windows XP上运行. 安装 WampServer 必须 ...