又是一道關於概率的題目,考慮dp方法,關鍵是找准突破口,將題目條件的“至少有一個大於4的連通圖”轉換為“所有連通圖都小於等於3”。
代碼:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define CHECKTIME() printf(%.2lf , (double)clock() / CLOCKS_PER_SEC) typedef pair pii; typedef long long llong; typedef pair pll; #define mkp make_pair /*************** Program Begin **********************/ double dp[51][51][51]; bool solved[51][51][51]; class RandomGraph { public: int n; double p; double rec(int a, int b, int c) { double & res = dp[a][b][c]; if (solved[a][b][c]) { return res; } int r = n - (a + 2 * b + 3 * c); // base case if (0 == r) { res = 1.0; solved[a][b][c] = true; return res; } res = 0.0; // r != 0 res += pow(1 - p, a + 2 * b + 3 * c) * rec(a + 1, b, c); if (a >= 1) { res += pow(1 - p, a + 2 * b + 3 * c - 1) * a * p * rec(a - 1, b + 1, c); } if (a >= 2) { res += pow(1 - p, a + 2 * b + 3 * c - 2) * p * p * a * (a - 1) / 2 * rec(a - 2, b, c + 1); } if (b >= 1) { res += pow(1 - p, a + 2 * b + 3 * c - 1) * p * 2 * b * rec(a, b - 1, c + 1); res += pow(1 - p, a + 2 * b + 3 * c - 2) * p * p * b * rec(a, b - 1, c + 1); } solved[a][b][c] = true; return res; } double probability(int n, int p) { double res = 0; this->n = n; this->p = p / 1000.0; memset(solved, 0, sizeof(solved)); res = 1 - rec(0, 0, 0); return res; } }; /************** Program End ************************/
《C++ Primer 4th》讀書筆記 第9章-順序容器,
STL中list的erase()方法,stllisteras
LeetCode ZigZag Conversion
POJ 3126 Prime Path( 廣搜 ) Pr
本程序實現一個分析C語言的詞法分析+語法分析。 注意:
《C++ Primer 4th》讀書筆記 第7章-函數,py