题意:
解法:
for(int i=1;i<=n;i++){
//枚举第i个数字前面i-m个位置,是否存在相同的数字
for(int j=i;j>=max(1,i-m);j--){
b[j] = (b[j]%mod + b[j-1]%mod - dp[j][a[i]] + mod)%mod;
dp[j][a[i]] = b[j-1];
}
}
时间复杂度:
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
ll dp[maxn][12],b[maxn];
int a[maxn];
const ll mod = 1e9 + 7;
int main()
{
int n , m , k;
b[0] = 1;
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i] = 0;
for(int j=1;j<=k;j++)
dp[i][j] = 1ll*0;
}
for(int i=1;i<=n;i++){
for(int j=i;j>=max(1,i-m);j--){
b[j] = (b[j]%mod + b[j-1]%mod - dp[j][a[i]] + mod)%mod;
dp[j][a[i]] = b[j-1];
}
}
printf("%lld\n",b[n-m]);
}
return 0;
}