藍橋杯 概率計算 動態規劃解法

2021-10-02 08:43:23 字數 1577 閱讀 4781

生成n個∈[a,b]的隨機整數,輸出它們的和為m的概率。

輸入格式

一行輸入四個整數依次為n,a,b,x,用空格分隔。

輸出格式

輸出一行包含乙個小數字和為m的概率,小數點後保留四位小數

2 1 3 4

0.3333

對於50%的資料,n≤5.

對於100%的資料,n≤100,b≤100.

一開始我是直接記憶搜尋去解的

然後我發現後台資料很大,以至於使用

typedef

long

long ll;

也不能夠表達出所有的情況 (b-1+1)n

於是換一種方法

狀態定義:

#define maxlen 114

#define maxsum 11451

// dp[i][j]表示:前 i 個數字加和等於 j 的概率

double dp[maxlen]

[maxsum]

;

狀態轉移:

在第i個數字選擇了x的情況下

dp[i][j] 的概率,就是dp[i-1][j-x]的概率

(或者說dp[i-1][j-x]的概率是組成dp[i][j] 的概率的一部分,因為我們不可能只考慮選x,應該考慮選取a到b之間的所有整數)

所以推得最終狀態轉移方程:

sum表示求和,1

/(b-a+

1)是第i個數字選擇x的概率,x範圍[a, b]

dp[i]

[j]=

sum(dp[i-1]

[j-x])*

1/(b-a+

1)

for

(int i=

2; i<=n; i++)}

dp[i]

[j]/

=(b-a+1)

;}}

#include

#include

using

namespace std;

#define maxlen 114

#define maxsum 11451

// dp[i][j]表示:前 i 個數字加和等於 j 的概率

double dp[maxlen]

[maxsum]

;int n, a, b, m;

intmain()

}// 計算第乙個數能表示 i 的概率

for(

int i=

0; i<=m; i++)}

for(

int i=

2; i<=n; i++)}

dp[i]

[j]/

=(b-a+1)

;}}printf

("%.4lf\n"

, dp[n]

[m])

;return0;

}

藍橋杯 拿糖果 動態規劃解法

上次寫過乙個類似的,用的dfs 記憶 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知道最多可以拿多少糖。輸入格式 乙個整數n...

藍橋杯 乘積最大II 動態規劃解法

因為資料不大,存在 暴力解法 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串...

藍橋杯 概率計算 (概率DP)

題目傳送 藍橋杯 概率計算 時間限制 1.0s 記憶體限制 256.0mb 錦囊1 錦囊2 錦囊3 問題描述 生成n個 a,b 的隨機整數,輸出它們的和為x的概率。輸入格式 一行輸入四個整數依次為n,a,b,x,用空格分隔。輸出格式 輸出一行包含乙個小數字和為x的概率,小數點後保留四位小數 樣例輸入...