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

更新于:2020年6月4日

426 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.