C++ 中音乐播放列表的数量
假设我们有一个音乐播放器,其中包含 N 首不同的歌曲,我们想在旅途中收听 L 首歌曲。因此,我们必须制作一个播放列表,以满足以下条件:
每首歌曲至少播放一次
一首歌曲只有在播放了 K 首其他歌曲后才能再次播放。
我们必须找到可能的播放列表的数量。答案可能非常大,因此我们将返回它对 10^9 + 7 取模的结果。
因此,如果输入类似于 N = 2,L = 3,K = 0,则输出将为 6,因为有 6 个可能的播放列表:[1,1,2],[1,2,1],[2,1,1],[2,2,1],[2,1,2],[1,2,2]。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 add(),它将接收 a、b,
返回 ((a mod m) + (b mod m)) mod m
定义一个函数 sub(),它将接收 a、b,
返回 ((a mod m) - (b mod m) + m) mod m
定义一个函数 mul(),它将接收 a、b,
返回 ((a mod m) * (b mod m)) mod m
在主方法中,执行以下操作:
创建一个大小为 dp(L + 1) x (N + 1) 的二维数组
dp[0, 0] := 1
对于初始化 i := 1,当 i <= L 时,更新(i 增加 1),执行:
对于初始化 j := 1,当 j <= N 时,更新(j 增加 1),执行:
dp[i, j] := mul(dp[i - 1, j - 1], (N - (j - 1)))
如果 j > K,则:
dp[i, j] := add(dp[i, j], mul(dp[i - 1, j], j - K))
返回 dp[L, N]
让我们看看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 7;
typedef long long int lli;
class Solution {
public:
int add(lli a, lli b){
return ((a % m) + (b % m)) % m;
}
int sub(lli a, lli b){
return ((a % m) - (b % m) + m) % m;
}
int mul(lli a, lli b){
return ((a % m) * (b % m)) % m;
}
int numMusicPlaylists(int N, int L, int K) {
vector < vector <int> > dp(L + 1, vector <int>(N + 1));
dp[0][0] = 1;
for(int i = 1; i <= L; i++){
for(int j = 1; j <= N; j++){
dp[i][j] = mul(dp[i - 1][j - 1], (N - (j - 1)));
if(j > K){
dp[i][j] = add(dp[i][j], mul(dp[i - 1][j], j -
K));
}
}
}
return dp[L][N];
}
};
main(){
Solution ob;
cout << (ob.numMusicPlaylists(2, 3, 0));
}输入
2,3,0
输出
6
广告
数据结构
网络
关系型数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP