2022“杭电杯”中国大学生算法设计超级联赛(9)补题 1007 持续更新中

本文介绍了一种关于将n个大小不等的套娃分成k组,每组间大小差至少r的数学问题。通过动态规划求解f[i][j],即前i个娃娃分到j组的合法方案数,关键在于考虑插入新娃娃和调整已有组别的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1007 Matryoshka Doll


1007 Matryoshka Doll(DP)

题目链接

分析:有n个套娃,大小为a1<=a2<=……<=an,要将这些套娃分成k组,每组套娃按照大小排序后相邻两个套娃之间的大小差距要求>=r,求方案数。

f[i][j]表示将前i个娃分成j组的合法方案数

f[i][j]=(f[i-1][j-1]+1ll*f[i-1][j]*max(0,j-t))%mod

f[i-1][j-1]是前i-1个套娃分成了j-1组,第i个套娃单独成为一组的情况;

1ll*f[i-1][j]*max(0,j-t)是前i-1个套娃分成了j组,第i个套娃放在已经分好的j组的其中一组里面,需要找到有多少组是可以放下第i个套娃的

/**/
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int T;
int a[5005],f[5005][5005];//f[i][j]表示将前i个娃分成j组的合法方案数
int main(){
	cin>>T;
	while(T--){
		int k,n;
		int r;
		cin>>n>>k>>r;
		f[0][0]=1;//注意初始化 
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i=1;i<=n;i++){	
			int t=i-1;//记录有多少个满足a[i]-a[j]>=r 
			while(t&&a[i]-a[t]<r) t--;//a[i]-a[t]<r不满足题意 
			t=i-t-1; //a[i]可以加入的组数 
			for(int j=1;j<=i;j++){
				f[i][j]=(f[i-1][j-1]+1ll*f[i-1][j]*max(0,j-t))%mod;
			}
		}
		cout<<f[n][k]<<endl;
	}	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值