2018牛客多校第一场 dp Removal

参考博客
题意:一个数组s,长度为n(n≤1e5),数组元素s[i]≤10, 要求从中删除m(m≤10)个数字,求能得到多少个不重复的结果, mod 1e9+7

思路
这里写图片描述

注意坑点在二维数组的初始化,直接 szieof(dp)是不行的
还有取模也需要略微注意,只要遇到减法,就要进行先加后取模。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
const int N = 1e5+127;
int a[N],pre[N],pos[N];
int dp[N][100];
const int mod = 1e9+7;
int main()
{
    while(cin>>n>>m>>k)
    {
        memset(dp,0,20*sizeof (int)*n);
        memset(pos,0,sizeof pos);

        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            pre[i] = pos[a[i]];
            pos[a[i]]  =i;
        }
        dp[0][0]= 1;

        for(int i=1; i<=n; i++)
        {
            dp[i][0] = 1;
            for(int j=1; j<=m&&j<=i; j++)
            {
                dp[i][j] = dp[i-1][j]+dp[i-1][j-1];
                dp[i][j]%=mod;

                if(pre[i]-1>=0&&j-(i-pre[i])>=0&&i-pre[i]>=0)
                {
                    dp[i][j]-=dp[pre[i]-1][j-(i-pre[i])];
                }
                dp[i][j]  = (dp[i][j]+mod)%mod;
            }
        }
        cout<<dp[n][m]<<endl;
    }



    return 0;
}

猜你喜欢

转载自blog.csdn.net/axuhongbo/article/details/82048041