牛客競(jìng)賽題目講解_Removal
// https://ac.nowcoder.com/acm/contest/20322/E
#include "stdafx.h"
//#include <bits/stdc++.h>
#include <algorithm>
#include <iostream>
#include <cstring>
?#include <vector>
using namespace std;
const int maxn=1.1e5+10;
const int mod=1e9+7;
typedef long long ll;
int m,n,k;
int a[maxn]={0,5,3,2,1,2};
ll dp[maxn][11];
int last[maxn],c[maxn];
int main()
{
n=5,m=2;
//while(scanf("%d %d %d",&n,&m,&k)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(last,0,sizeof(last));
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i)
{
//scanf("%d",&a[i]);
last[i]=c[a[i]];
c[a[i]]=i;
}
for(int i=0;i<=n;++i) dp[i][i]=dp[i][0]=1;
?
for(int i=1;i<=n;++i)
for(int j=1;j<=min(i-1,m);++j)
{
dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod;
if(last[i]!=0&&i-last[i]<=j)
{
cout<<"i="<<i<<", last[i]="<<last[i]<<", j="<<j<<", dp[i][j]="<<dp[i][j]<<endl;
cout<<" dp[last[i]-1][j-(i-last[i])]="<<dp[last[i]-1][j-(i-last[i])]<<endl;
dp[i][j]=(dp[i][j]-dp[last[i]-1][j-(i-last[i])]+mod)%mod;
}
}
printf("%lld\n",dp[n][m]);
}
}