1 条题解

  • 0
    @ 2026-10-19 1:36:26

    [NOIP 2012 普及组] 摆花

    知识点

    动态规划、有界计数、前缀和优化

    解题思路

    dp[j]表示处理若干花种后恰摆j盆的方案。加入上限a的花种时,ndp[j]=Σdp[j-k](0≤k≤a且k≤j)。用前缀和或滑动窗口计算此和,模1000007。

    正确性说明

    每种花相邻且种类顺序固定,一组数量唯一决定排列。按最后一类花取k盆划分的方案互斥穷尽,故卷积转移准确。前缀和仅加速相同区间求和,不改变计数。

    易错点

    模数为1000007,不是1000000007;某类上限可为0;恰好m盆,不能累计所有≤m的状态。

    复杂度

    时间O(nm),空间O(m)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int n,m;cin>>n>>m;const int P=1000007;vector<int>d(m+1),v(m+1);d[0]=1;for(int i=0,a;i<n;i++){cin>>a;long long sum=0;for(int j=0;j<=m;j++){sum+=d[j];if(j-a-1>=0)sum-=d[j-a-1];sum=(sum%P+P)%P;v[j]=sum;}d.swap(v);}cout<<d[m]<<'\n';}
    
    • 1

    信息

    ID
    907
    时间
    1000ms
    内存
    125MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者