题解:BZOJ 4361 isn【dp】【容斥】

该博客介绍了如何解决一个关于序列排列的数学问题,要求将一个序列转换为非降序,通过删除元素实现。博主提出利用动态规划`f[i][j]`表示选到第`i`个元素且已删除`j`个元素的方案数,并采用树状数组进行优化。计算过程中考虑了元素选取顺序的影响,以及在到达某个位置时可能已满足非降序条件的容斥原理。

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

给出一个长度为n的序列A(A1,A2…AN)。如果序列A不是非降的,你必须从中删去一个数,
这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。

对于这个题目,我们用 f [ i , j ]表示选到 i ,i 必须选,已经删了j个,构成一个不降的子序列的方案数
于是由于每次都是从前for,然后统计个数,我们考虑用树状数组优化
因为取出来有一定的顺序,所以要乘以 ( n - i ) !
最后因为可能在去i+1的时候就已经不降了,所以我们需要容斥一下

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define re register
#define gc getchar()
#define ll long long
inline int read()
{
   
   
	re int x(0); re char ch(gc);
	while(ch>'9'||ch<'0') ch=gc;
	while(ch>='0'&&ch<='9') x=(x*10)+(ch^48),ch=gc;
	return x;
}
const int N=2200,mod=1e9+7;
int a[N]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值