参考博客
题意:一个数组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;
}