首页 > 其他分享 >Trick 1: 一个关于排列计数的问题

Trick 1: 一个关于排列计数的问题

时间:2022-12-18 13:44:06浏览次数:61  
标签:排列 插入 sum 个数 Trick 计数 DP

大概是这样一个故事:

AT DP Contest G
一个排列 \(P\),给你 \(n-1\) 条限制,每个限制表示相邻的两数的大小关系
求排列的方案数
\(n = 3000\)

那么我们有这样一个解法:DP,仅考虑当前相邻两数大小情况。

考虑设 \(f(i,j)\) 表示第 \(i\) 个数,前面比它小的有 \(j\) 个,的方案数。

那么仅考虑与 \(P_{i-1}\) 的关系,以 \(P_{i-1}< P_i\) 为例。

先假设有 \(i\) 个空位,我们把 \(P_i\) 放在了第 \(j+1\) 个空位上,那么比它小的数就有 \(j\) 个。

然后我们把 \(P_{i-1}\) 插在了它的前面某个位子,相当于求 \(\sum \limits_{k<j}f(i-1,k)\),并且仍然保留“当前共有 \(i-1\) 个空位”这个性质,使得二维 DP 得以实施。

关于枚举 \(k\):前缀和优化。

void solve(){
	cin>>n;
	cin>>(str+1);
	f[1][0]=1; sum[1][0]=1;
	for(ll i=2;i<=n;i++){
		for(ll j=0;j<i;j++){
			ll lft=j, rht=i-1-j;
			if(str[i-1]=='>'){
				if(!rht) continue;
				f[i][j]=sum[i-1][i-2] - sum[i-1][j-1] + mod;
				f[i][j] %= mod;
			}
			if(str[i-1]=='<'){
				if(!lft) continue;
				f[i][j]=sum[i-1][j-1];
			}
		}
		sum[i][0]=f[i][0];
		for(ll j=1;j<i;j++) sum[i][j]=(sum[i][j-1]+f[i][j])%mod; 
	}
	ll ans=0;
	for(ll i=0;i<n;i++) ans=(ans+f[n][i])%mod;
	cout<<ans<<endl;
}

AT abc282 g
两个排列 \(A,B\)
求有多少种有序排列对 \((A,B)\) 满足:
恰好有 \(k\) 个 \(i\) 满足 \((A_{i+1}-A_i)(B_{i+1}-B_i)>0\).

我第一眼想到的是按 \(A_i\) 的顺序插入,但是 \(B_i\) 无需不好维护。想想上面的题对这题有无帮助。

若考虑按顺序 DP,维护 \(A\) 的插入情况和 \(B\) 的插入情况,要好做的多。

\(f(i,j,k,l)\) 表示第 \(i\) 个位置,\(A\) 排列中当前元素前面有 \(j\) 个数,\(B\) 有 \(k\) 个数,一共是 \(l\) 个相同的大于小于情况。转移的话需要二维前缀和优化 /tuu 超级恶心吧

虽然 1024MB 的空间,可能还是要滚一下。暂时没写代码。


Luogu P4099

标签:排列,插入,sum,个数,Trick,计数,DP
From: https://www.cnblogs.com/BreakPlus/p/16990296.html

相关文章

  • 2021年蓝桥杯A组省赛-回路计数 【状压dp】
    题面分析单源最短Hamilton路径的状压dp模板题。\(dp[i][j]\)表示终点为\(j\),经过的点集状态为\(i\)的方案数。假设状态由\(k\)转移到\(j\)。当前计算\(dp[i][j]\),那么i......
  • 8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 YL69
    特点:●编码器解码转换成标准ModbusRTU协议●可用作编码器计数器或者转速测量●支持8个编码器同时计数,可识别正反转●也可以设置作为16路独立DI高速计数器● 编码器计......
  • 闲话/社论 22.12.15 两道计数题
    闲话好今天闲话终于有点拿得出手的东西了向计数巨佬们致以敬意和谢意。既然代码之后补了,那我这也少写点闲话吧(一会再补!下面是社论部分!两道计数题首先感谢jijidawan......
  • 全排列(递归)
    排列:从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为......
  • LeetCode HOT 100:全排列
    题目:46.全排列题目描述:给你一个没有重复元素的数组,返回其所有可能的全排列。全排列是什么呢?举个简单的例子,数组[1,2,3],其中一个排列为[2,1,3],该数组所有的全排列为[......
  • [IOI2019]排列鞋子
    $[IOI2019]$排列鞋子链接:https://www.luogu.com.cn/problem/P5749题目描述:将一个序列$A$交换到满足对于任意的$i(1<=i<=n/2)$满足$a_{i}=-a_{i\times2}$且$a_{i}<......
  • [ZJOI2010]排列计数
    $[ZJOI2010]$排列计数链接:https://www.luogu.com.cn/problem/P2606题面:求满足$p_{i}>p_{i/2}(∀i∈[2,n])$的排列个数。题解:考虑将限制转化成一棵树,如果我们将$i......
  • matlab 6.5 设计数字滤波器
    1、用脉冲响应不变法设计一个Butterworth低通数字滤波器,通带截止频率为0.4π  ,通带波纹Rp小于3dB,阻带边界频率为0.6π,阻带衰减大于15dB,采样频率Fs=10000Hz。假设一个信号......
  • 计数+分治求海量数据中重复最多的一个
    海量数据中求取出现次数最多的一个:计数法:(一).思想:(1)假设一天之内某个IP访问百度的次数不超过40亿次,则访问次数可以用unsigned表示.用数组统计出每个IP地址出现的次数,即......
  • 力扣-31-下一个排列
    很明显,对于一个排列而言,最后一个位置是动不了的那么就从倒数第二个位置开始用递归一点点分析错了几次之后终于自己写出来了(叉腰骄傲)voidnextPermutation(vector<int>&......