日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[AtCoder Educational DP Contest] J - Sushi(期望dp)

發(fā)布時(shí)間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [AtCoder Educational DP Contest] J - Sushi(期望dp) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

problem

luogu

現(xiàn)有N(1≤N≤300)N(1 ≤ N ≤ 300)N(1N300) 個(gè)盤子,編號(hào)為1,2,3,…,N1,2,3,…,N1,2,3,,N

iii個(gè)盤中放有 ai(1≤ai≤3)a_i(1≤a_i ≤3)ai?(1ai?3)個(gè)壽司。

接下來(lái)每次執(zhí)行以下操作,直至吃完所有的壽司。

從第 1,2,3,…,N1,2,3,…,N1,2,3,,N 個(gè)盤子中任選一個(gè)盤子,吃掉其中的一個(gè)壽司。若沒(méi)有壽司則不吃。

若將所有壽司吃完,請(qǐng)問(wèn)此時(shí)操作次數(shù)的數(shù)學(xué)期望是多少?

solution

最直接地設(shè) f(a1,a2,a3,...,an):f(a_1,a_2,a_3,...,a_n):f(a1?,a2?,a3?,...,an?):iii 盤還剩 aia_iai? 個(gè)壽司的期望次數(shù)。

那么枚舉隨機(jī)到的盤子,有方程:f(a1,a2,...,an)=1+∑i=1n1nf(a1,a2,...,max?(ai?1,0),...,an)f(a_1,a_2,...,a_n)=1+\sum_{i=1}^n\frac{1}{n}f(a_1,a_2,...,\max(a_i-1,0),...,a_n)f(a1?,a2?,...,an?)=1+i=1n?n1?f(a1?,a2?,...,max(ai??1,0),...,an?)

顯然這個(gè)等式不能構(gòu)成轉(zhuǎn)移方程,因?yàn)榇嬖谠卮蜣D(zhuǎn)(第 iii 盤壽司為空時(shí),就變成了自身轉(zhuǎn)移到自身,狀態(tài)不變)的情況。

由于隨機(jī)均勻分布,盤子的位置是不重要的,事實(shí)上我們真正關(guān)注的只有盤子中剩余壽司的數(shù)量。

aia_iai? 壽司數(shù)量又只有四種取值 0/1/2/30/1/2/30/1/2/3

不妨重新設(shè) f(o,i,j,k):f(o,i,j,k):f(o,i,j,k): 當(dāng)前還剩下 o/i/j/ko/i/j/ko/i/j/k 個(gè)盤子中有 0/1/2/30/1/2/30/1/2/3 個(gè)壽司。

則有轉(zhuǎn)移:
f(o,i,j,k)=1+onf(o,i,j,k)+inf(o+1,i?1,j,k)+jnf(o,i+1,j?1,k)+knf(o,i,j+1,k?1)f(o,i,j,k)=1+\frac{o}{n}f(o,i,j,k)+\frac{i}{n}f(o+1,i-1,j,k)+\frac{j}{n}f(o,i+1,j-1,k)+\frac{k}{n}f(o,i,j+1,k-1) f(o,i,j,k)=1+no?f(o,i,j,k)+ni?f(o+1,i?1,j,k)+nj?f(o,i+1,j?1,k)+nk?f(o,i,j+1,k?1)

n?onf(o,i,j,k)=1+inf(o+1,i?1,j,k)+jnf(o,i+1,j?1,k)+knf(o,i,j+1,k?1)\frac{n-o}{n}f(o,i,j,k)=1+\frac{i}{n}f(o+1,i-1,j,k)+\frac{j}{n}f(o,i+1,j-1,k)+\frac{k}{n}f(o,i,j+1,k-1) nn?o?f(o,i,j,k)=1+ni?f(o+1,i?1,j,k)+nj?f(o,i+1,j?1,k)+nk?f(o,i,j+1,k?1)

f(o,i,j,k)=ni+j+k+ii+j+kf(o+1,i?1,j,k)+ji+j+kf(o,i+1,j?1,k)+ki+j+kf(o,i,j+1,k?1)f(o,i,j,k)=\frac{n}{i+j+k}+\frac{i}{i+j+k}f(o+1,i-1,j,k)+\frac{j}{i+j+k}f(o,i+1,j-1,k)+\frac{k}{i+j+k}f(o,i,j+1,k-1) f(o,i,j,k)=i+j+kn?+i+j+ki?f(o+1,i?1,j,k)+i+j+kj?f(o,i+1,j?1,k)+i+j+kk?f(o,i,j+1,k?1)

這樣就不存在狀態(tài)相同的死循環(huán)轉(zhuǎn)移了。

但是現(xiàn)在是 O(n4)O(n^4)O(n4) 的,需要進(jìn)一步優(yōu)化。

不難發(fā)現(xiàn),盤子數(shù)量是固定不變的,即 o+i+j+k=no+i+j+k=no+i+j+k=n,所以當(dāng)我們知道了其中任意三個(gè)數(shù),就能推出剩下一個(gè)數(shù)。

設(shè) f(i,j,k):f(i,j,k):f(i,j,k): 當(dāng)前還剩下 i/j/ki/j/ki/j/k 個(gè)盤子中有 1/2/31/2/31/2/3 個(gè)壽司。
f(i,j,k)=ni+j+k+ii+j+kf(i?1,j,k)+ji+j+kf(i+1,j?1,k)+ki+j+kf(i,j+1,k?1)f(i,j,k)=\frac{n}{i+j+k}+\frac{i}{i+j+k}f(i-1,j,k)+\frac{j}{i+j+k}f(i+1,j-1,k)+\frac{k}{i+j+k}f(i,j+1,k-1) f(i,j,k)=i+j+kn?+i+j+ki?f(i?1,j,k)+i+j+kj?f(i+1,j?1,k)+i+j+kk?f(i,j+1,k?1)
最后還要注意循環(huán)枚舉的細(xì)節(jié):

  • kkk 只用了 k?1k-1k?1,當(dāng)在 (i,j)(i,j)(i,j) 時(shí)會(huì)問(wèn)到 j+1j+1j+1,所以 kkk 要在 jjj 循環(huán)的外層。
  • 同理 jjj 會(huì)用到同 kkk 下的 j+1j+1j+1,但此時(shí)是 i?1i-1i?1,所以 jjj 循環(huán)要在 iii 的外層。
  • 綜上我們確定唯一的循環(huán)順序是 k,j,ik,j,ik,j,i

時(shí)間復(fù)雜度: O(n3)O(n^3)O(n3)

code

#include <bits/stdc++.h> using namespace std; #define maxn 305 double f[maxn][maxn][maxn]; int a[5]; int n; int main() {scanf( "%d", &n );for( int i = 1, x;i <= n;i ++ ) scanf( "%d", &x ), a[x] ++;for( int k = 0;k <= n;k ++ )for( int j = 0;j <= n;j ++ )for( int i = 0;i <= n;i ++ )if( i or j or k ) {if( i ) f[i][j][k] += f[i - 1][j][k] * i / (i + j + k);if( j ) f[i][j][k] += f[i + 1][j - 1][k] * j / (i + j + k);if( k ) f[i][j][k] += f[i][j + 1][k - 1] * k / (i + j + k);f[i][j][k] += n * 1.0 / (i + j + k);} printf( "%.10f\n", f[a[1]][a[2]][a[3]] );return 0; }

總結(jié)

以上是生活随笔為你收集整理的[AtCoder Educational DP Contest] J - Sushi(期望dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。