比賽 每日一題 dfs dp

2021-10-09 09:44:09 字數 2476 閱讀 3350

題目:

你在打比賽,這場比賽總共有12個題

對於第i個題,你的隊伍有a[i]的機率解決她

如果解決不了她呢?

由於所有人討論的都很大聲

所以你有b[i]的概率從左邊那個隊那裡聽會這個題的做法

有c[i]的概率從右邊那個隊那裡聽會這個題的做法

請問最終你們隊伍解出0-12題的概率分別是多少

輸入描述:

第一行12個數表示a[1] -> a[12]

第二行12個數表示b[1] -> b[12]

第三行12個數表示c[1] -> c[12]

輸出描述:

輸出13行,第i行表示解出i-1題的概率

保留6位小數

示例1輸入

0.20 0.30 0.37 0.40 0.45 0.50 0.57 0.60 0.75 0.76 0.77 0.83

0.85 0.88 0.90 0.94 0.100 0.104 0.105 0.107 0.115 0.120 0.122 0.125

0.128 0.130 0.134 0.140 0.149 0.150 0.152 0.155 0.170 0.183 0.203 0.240

輸出0.000000

0.000000

0.000000

0.000011

0.000160

0.001508

0.009620

0.041938

0.124153

0.243773

0.301960

0.212453

0.064424

這個題目有兩種做法,第一種的dfs。因為題目資料範圍較小,題目數量只有12。每道題目要麼做出來要麼做不出來來兩種狀態。最大也就是2^12.可以直接暴力搜尋。

首先正難則反,容易得到每個題目做不出來的概率,(1-a[i])(1-b[i])(1-c[i]),那麼就可以得到做出來的概率是1-(1-a[i])(1-b[i])(1-c[i])。r為當前做對的值,當做對的數量小於要求時,可以往做出和做不出兩邊搜尋。否則只能往做不出的方向搜尋。

**:

#include

#include

#include

#include

#define inf 0x3f3f3f3f

//const int maxn=;

using

namespace std;

typedef

long

long ll;

double a[15]

,b[15

],c[15]

,p[15];

double answer=

0.0;

void

dfs(

int need,

int pos,

int r,

double ans)

if(rdfs(need,pos+

1,r,ans*(1

-p[pos]))

;}int main (

)//cout(int i=

1;i<=

13;i++

)return0;

}

第二種:dp做法,用dp[i][j]表示前i個對了j個的概率。那麼dp[i][j]的概率就等於前i-1個對了j個的,這個不對的概率,加上前i-1個對了j-1個,這個對了的概率。dp[i][j]=dp[i-1][j]*(1-p[i])+dp[i-1][j-1]p[i]。

j=0的時候,j-1<0,那麼就特殊判斷一下,它的概率等於dp[i-1][0](1-p[i])。

**:

#include

#include

#include

#include

#define inf 0x3f3f3f3f

//const int maxn=;

using

namespace std;

typedef

long

long ll;

double a[15]

,b[15

],c[15]

,p[15];

double dp[15]

[15];

int main (

)//cout[0]=

1;// dp[1][0]=1-p[1];

// dp[1][1]=p[1];

// for(int i=2;i<=12;i++)

// dp[i][0]=dp[i-1][0]*(1-p[i]);

for(

int i=

1;i<=

12;i++)}

for(

int i=

0;i<=

12;i++

)printf

("%.6lf\n"

,dp[12]

[i])

;return0;

}`

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...

每日一題2018 3 22

leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...