hihocoder 1882 : 播放列表 (DP 或 容斥)
#1882 : 播放列表
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi的手机中存着N首他喜爱的歌曲。现在小Hi希望制作一个长度为L的播放列表,满足
1. 每一首歌至少播放一编
2. 同一首歌不能连续播放,之间至少间隔一首其他歌曲
请你计算一共有多少种不同的播放列表满足条件?由于结果可能非常大,你只需要输出结果模1000000009的余数。
输入
两个整数N和L。
对于30%的数据,1 ≤ N ≤ 5,N ≤ L ≤ 10
对于100%的数据,1 ≤ N ≤ 1000, N ≤ L ≤ 2000
输出
一个整数,代表答案。
样例输入
3 4
样例输出
18
dp[i][j]代表着
#include<bits/stdc++.h>
using namespace std;
long long mod=1000000009;
int n,l;
long long dp[2005][2005];
int main()
{
cin>>n>>l;
memset(dp,0,sizeof(dp));
dp[1][1]=n;//播放列表为i,有j首歌曲的数量 开始有n种选择
for(int i=1; i<l; i++)
{
for(int j=1; j<=n; j++)
{
dp[i+1][j]= (dp[i+1][j]+dp[i][j]*(j-1)%mod)%mod;//如果不选新歌 ,有j-1种选法,
dp[i+1][j+1]=(dp[i+1][j+1] + dp[i][j]*(n-j)%mod)%mod;//如果选新歌,有n-j种选法
}
}
cout<<dp[l][n]<<endl;
return 0;
}