t
a
g
:
tag :
tag: 计数
前缀和优化dp
难
传送门 :
题意 : 给定 N , M N,M N,M询问有多少种序列满足条件
条件如下 : ∀ i , ( 1 ≤ a [ i ] ≤ M ) \forall i\ ,(1\le a[i] \le M) ∀i ,(1≤a[i]≤M) ∣ a ∣ = N |a|=N ∣a∣=N ∣ a i − a i + 1 ∣ ≥ K |a_i-a_{i+1}|\ge K ∣ai−ai+1∣≥K 即长度 N N N,值域是 M M M,相邻元素的差绝对值大于 K K K
思路 : 状态表示 : d p [ i ] [ j ] dp[i][j] dp[i][j] 前 i i i个并且以 j j j结尾的方案数
状态转移 : d p [ i + 1 ] [ j ] = ( d p [ i ] [ 1 ] + . . . . + d p [ i ] [ j − K ] ) + ( d p [ i ] [ j + K ] + . . . . d p [ i ] [ M ] ) dp[i+1][j]=(dp[i][1]+....+dp[i][j-K])+(dp[i][j+K]+....dp[i][M]) dp[i+1][j]=(dp[i][1]+....+dp[i][j−K])+(dp[i][j+K]+....dp[i][M])
时间复杂度 O ( N M 2 ) O(NM^2) O(NM2)显然 T L E TLE TLE
但是其实我们并不需要去枚举转移
我们发现,我们可以单独计算出来上一层的 d p [ i ] [ 1 ] + . . . . d p [ i ] [ j − k ] dp[i][1]+....dp[i][j-k] dp[i][1]+....dp[i][j−k] 这种状态
显然这里可以使用到 前缀和进行优化
因此时间复杂度将为 O ( N M ) O(NM) O(NM)
code :
ll f[N][N];
ll s[N];
int n,m,k;
void solve(){
cin>>n>>m>>k;
for(int i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?