火題小戰 A 玩個球 計數DP

2022-01-10 17:38:00 字數 1539 閱讀 6514

給你 \(n\) 種顏色的球,每個球有 \(k\) 個,把這 \(n\times k\) 個球排成一排,把每一種顏色的最左邊出現的球塗成白色(初始球不包含白色),求有多少種不同的顏色序列,答案對 \(10^9+7\) 取模。

對於\(30\%\)的資料,\(n \leq 3,k \leq 3\);

對於\(50\%\)的資料,\(n \leq 300,k \leq 300\);

對於另外\(20\%\)的資料,\(n = 2\);

對於\(100\%\)的資料,\(n \leq 2000,k \leq 2000\); 。

觀察這一道題的資料範圍,我們可以使用 \(n^2\) 的做法

乙個比較容易得出的結論是,如果你從左向右數的話,那麼白球的數量一定大於等於經你已選擇的顏色種類數

因此,我們設 \(f[i][j]\) 為當前已經放置了 \(i\) 個白球和 \(j\) 種其它顏色的球的合法方案數

下面我們考慮轉移

首先, \(f[i][j]\) 一定可以由 \(f[i-1][j]\) 轉移過來

因為如果當前你已經放置了 \(i-1\) 個白球和 \(j\) 種其他顏色的球,那麼你在後面再放乙個白球是沒有影響的

接下來我們考慮 \(f[i][j-1]\) 的轉移

首先,當前已經選擇了 \(j-1\) 種顏色的球,那麼我們還有 \(i-j+1\) 種顏色沒有選擇

對於某一種顏色的球,如果我們選擇了它,那麼我們必須從中選出乙個球放在最前面

這樣可以避免重複的情況

此時,這一種顏色的球已經被選擇了 \(1\) 個放在最前面,還有 \(1\) 個被塗成了白球

還剩下 \(k-2\) 個

我們只需要從剩下的 \(n \times k-i-1- (j-1) \times (k-1)\)中選擇 \(k-2\) 個位置就可以

我們預設之前的 \(j-1\) 種顏色的球已經放好

因此遞推式為

\[f[i][j]=f[i-1][j]+f[i][j-1] \times (n-j+1) \times c_^

\]最後注意一下 \(k=1\) 時的特判

#includeusing namespace std;

#define int long long

const int mod=1e9+7;

const int maxn=2005;

int f[maxn][maxn],ny[maxn*maxn],jc[maxn*maxn],jcc[maxn*maxn];

int getc(int n,int m)

signed main()

ny[1]=1;

for(int i=2;i<=4000000;i++)

jc[0]=1,jcc[0]=1;

for(int i=1;i<=4000000;i++)

for(int i=0;i<=n;i++) f[i][0]=1;

for(int i=1;i<=n;i++)

} printf("%lld\n",f[n][n]%mod);

return 0;

}

什麼叫玩個球,這才叫真的玩個球 黑科技

可是,我真的去玩了乙個球,而且這個球還有乙個挺有意思的玩法。對,你沒有看錯,是網球,但是,玄機不在這個球上,而在球拍上。主辦方給了乙個場景,稱 兩個月前,蘋果的開發團隊在介紹全新的 watch os4時,曾向全世界介紹了這款當時尚未面世的產品。抬起手腕,就能看到自己的發球球速等資料,聽起來是不是很黑...

開發乙個火過王者榮耀的遊戲,球球大作戰,原始碼分享!

1 球球大作戰 在計算機逐步滲入社會生活各個層面的今天,計算機已經成為人們日常生活的一分,越來越多的人使用計算機辦公 娛樂等等。球球大作戰是曾經風靡一時的手機遊戲,現在咱們用c語言來盤他 2 背景知識 遊戲的基本操作包括鍵盤按下 上下左右四個方向,還有作弊測試按鍵空格鍵和a鍵 玩家可以在地圖上隨意移...

演算法題 模板 N個球放入M個盒子中

也就是所有球都是一樣的,但是盒子有區別,且不能出現空放的情況。採用插板法,相當於在n 1個空隙中,插入m個盒子,而由於不能有空盒子,所以n個球的最前邊或者最後邊一定會放乙個盒子,所以相當於n 1和間隙中放入m 1個盒子。c n 1,m 1 n m 0,n先假設m個盒子中都放好了1個球,即假設共有m ...