CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp)
题意:
求相邻无相同数字的合法的排列数
题解:
先将相同的数字分为一类,假设共有n组
定义\(dp[i][j]\)表示前i组数字恰好有j对相邻数字相同的方案数,那么最后答案就是dp[n][0]
已经考虑完了前\(i\)组数,现在考虑第\(i+\)组数,如何放置
首先可以枚举放\(k\)个位置,有\(C(cnt[i+1]-1,k-1)\)种放法,然后将这k个位置分成两类
一类放在相同的数字中间 放了\(L\)个位置,有\(C(j,L)\)种那么相邻相同的对数变成\(j - L\)对
一类不放相同的数字中间 放\(k - L\) 个位置,有\(C(S - j,k - L)\)种
最后第\(i+1\)组数 增加了\(cnt[i+1] - k\)对相邻相同的数,即最后变成\(dp[i+1][j - L + cnt[i+1] - k]\)
四层循环 复杂度\(O(n^{3})\)
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 800;
const int mod = 1e9 + 7;
int C[N][N];
void init(){
for(int i = 0;i < N;i++) C[i][0] = C[i][i] = 1;
for(int i = 2;i < N;i++){
for(int j = 1;j <= i;j++){
C[i][j] = (C[i-1][j] + C[i-1][j-1])%mod;
}
}
}
int dp[N][N],cnt[N],total[N];
vector<int> v;
int main(){
init();
int n,x,mx = 1;
cin>>n;
v.push_back(0);
for(int i = 1;i <= n;i++){
cin>>x;
if(!cnt[x]) v.push_back(x);
cnt[x]++;
}
for(int i = 1;i < v.size();i++) total[i] = total[i-1] + cnt[v[i]];
dp[0][0] = 1;
for(int i = 0;i < v.size() - 1;i++){
int num = cnt[v[i+1]],S = total[i]+1;
for(int j = S-1;j >= 0;j--){///j对不同
int kk = min(num,S);///kk个位置可选择
for(int k = 1;k <= kk;k++){
int L = min(j,k);
for(int l = L;S - j >= k - l;l--){
int &res = dp[i+1][j - l + num - k];
res = (res + 1LL * C[num - 1][k - 1] * C[j][l] % mod * C[S-j][k-l]%mod * dp[i][j]%mod)%mod;
}
}
}
}
cout<<dp[v.size()-1][0]<<endl;
return 0;
}
听说还有\(O(n^{2})\)的做法 用到了下面这个东西,研究一下再写写
有\(n_1\)个\(a_1\),\(n_2\)个\(a_2\),...\(n_r\)个\(a_r\)的相邻无相同的排列方法数
\]
CS Academy Distinct Neighbours(经典dp)的更多相关文章
- CS academy Binary Flips(dp)
开学啦,没啥时间写博客..过几天就能又停课啦qwq 做点中等 \(dp\) 题来找找 noip 的感觉 233 题意 原题戳这里. 给你一个 \(n \times m\) 的矩阵 \(A\) ,一开始 ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
- POJ 1160:Post Office 邮局经典DP
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17168 Accepted: 9270 Desc ...
随机推荐
- AMD、CMD、Common规范及对比
https://blog.csdn.net/bluesky1215/article/details/71081780 1.名词解释 AMD:Asynchronous Modules Definiti ...
- LINUX安装好后无法访问网络
LINUX安装好后无法访问网络 在虚拟机安装好新的LINUX系统后,ping www.baidu.com ,发现无法ping通. 键入ifconfig查询配置: eno16777728: flags= ...
- python 获取项目的根路径
root_path = os.path.abspath(os.path.dirname(__file__)).split('shippingSchedule')[0] shippingSchedule ...
- 即将开始的python之路
准备开始学py 记录一下 加油
- kickstart+pxe+tftp+ntp(http)自动化安装平台的搭建
听说过"克隆"吗,对于这个科技术语20年前可能还很陌生,羊可以克隆,通过基因dna序列:机器同样可以克隆通过网络IP! 如下为自动化安装平台: PXE(preboot execut ...
- php-5.6.26源代码 - 如何用C语言支持“类似异常”机制
代码编写在文件php-\Zend\zend.h #define zend_bailout() _zend_bailout(__FILE__, __LINE__) #ifdef HAVE_SIGSETJ ...
- 数据分析处理库Pandas——显示设置
获取最多打印行数 显示内容超出部分打印成省略号. 设置最多打印行数 获取最多打印列数 显示内容超出部分打印成省略号. 设置最多打印列数 获取打印字符串的最大长度 显示内容超出部分打印成省略号. 设置打 ...
- JVM——参数设置、分析
原文:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断 ...
- WCF入门二[WCF的配置文件]
一.概述 往往在很多项目中数据库连接字符串.变量和一些动态的加载类会写在配置文件中.WCF也会在配置文件中写入一些配置参数,比如服务的地址.服务用于发送和接收消息的传输和消息编码等,通过配置文件可以灵 ...
- svn TortoiseSVN 回滚版本
原文链接: http://keenwon.com/1072.html SVN是一个版本管理工具,在工作中经常使用,尤其是多人合作开发的时候,版本管理显得更加重要.需要使用回退的场景往往都比较" ...