原文链接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 记分牌 动态规划的更多相关文章

  1. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

  2. 简单动态规划-LeetCode198

    题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...

  3. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  4. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  5. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  6. C#递归、动态规划计算斐波那契数列

    //递归         public static long recurFib(int num)         {             if (num < 2)              ...

  7. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  8. 【体系结构】动态调度算法:记分牌算法和tomasulo算法

    记分牌和tomasulo算法 动态调度: 通过硬件在程序执行时重新安排代码的执行序列来减少竞争引起的流水线停顿时间 动态调度流水线具备以下功能: (1)允许按序取多条指令和发射多条指令----取指(I ...

  9. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

随机推荐

  1. 如何将代码通过vs2017加载到GitHub

    (1)登陆GitHub并注册账户,在用户中新建repository  (2)建立后,会给出新建repository地址,将其复制  (3)用VS新建一个项目,勾选“新建Git存储库”或者打开一个已经创 ...

  2. STM32应用实例十四:利用光敏二极管实现光度测量

    最近我们在开发臭氧发生器时,需要监测生成的臭氧的浓度,于是想到使用光度计来测量.因为不同浓度的臭氧对管的吸收作用是不相同的,于是检测光照强度的变化就可以得到相应的浓度数据. 1.硬件设计 此次光照度检 ...

  3. Windows7上完全卸载Oracle 12c操作步骤

    注:本文来源于:< Windows7上完全卸载Oracle  12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...

  4. bat如何实现多台android设备同时安装多个apk

    背景:在做预置资源(安装apk)时,有多台android设备需要做相同的资源(如:10台,安装10个apk).一台一台去预置的话(当然也可以每人一台去预置),耗时较长有重复性. 问题:如何去实现多台同 ...

  5. kafka架构浅显理解

    Kafka的概念: 1. AMQP协议 Advanced Message Queuing Protocol (高级消息队列协议) The Advanced Message Queuing Protoc ...

  6. verilog 异步复位代码

    module reset_sync (input clk, input reset_in, output reset_out); (* ASYNC_REG = 'b1; (* ASYNC_REG = ...

  7. Niagara workbench 介绍文档---翻译

    一. 发现在建立station的时候存在一些问题,所以对技术文档部分做一个详细的了解,在这之前对出现的问题总结一下 1.  在 Windows操作系统中Application Direction中可以 ...

  8. mysql 语句的使用清库数据转移

    mysql清空数据库表 方法1:重建库和表用mysqldump --no-data把建表SQL导出来,然后drop database再create database,执行一下导出的SQL文件: 方法2 ...

  9. 图像特征的提取(gaussian,gabor,frangi,hessian,Morphology...)及将图片保存为txt文件

    # -*- coding: utf-8 -*- #2018-2-19 14:30:30#Author:Fourmi_gsj import cv2 import numpy as np import p ...

  10. 手机app数据的爬取之mitmproxy安装教程

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...