SRM 620 D2L3: RandomGraph, dp
2014-06-15 16:43
381 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13143&rd=15853
参考:http://apps.topcoder.com/wiki/display/tc/SRM+620
又是一道关于概率的题目,考虑dp方法,关键是找准突破口,将题目条件的“至少有一个大于4的连通图”转换为“所有连通图都小于等于3”。
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> 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 ************************/
参考:http://apps.topcoder.com/wiki/display/tc/SRM+620
又是一道关于概率的题目,考虑dp方法,关键是找准突破口,将题目条件的“至少有一个大于4的连通图”转换为“所有连通图都小于等于3”。
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> 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 ************************/
相关文章推荐
- SRM 620 D2L3: RandomGraph, dp
- SRM 609 D2L3: VocaloidsAndSongs,dp
- SRM 610 D2L3:MiningGoldEasy,dp
- SRM 599 D2L3: SimilarNames2,dp
- SRM 572 D2L3:DistinctRemainders,dp,math
- SRM 612 D2L3:PowersOfTwo,dp
- SRM 602 D2L3:BlackBoxDiv2,dp
- SRM 627 D2L3: BubbleSortWithReversals, dp, 冒泡排序
- SRM 615 D2L3:MergeStrings,dp
- SRM 591 D2L3:YetAnotherTwoTeamsProblem,dp
- SRM 604 D2L3:FoxConnection2,dp
- SRM620
- SRM 626 D1L1: FixedDiceGameDiv1,贝叶斯公式,dp
- Topcoder SRM 651 div1 250 题解 (概率dp)
- SRM 502 DIV1 500pt(DP)
- SRM 511 DIV1 500pt(DP)
- SRM 596 D2 L2:ColorfulRoad,dp
- [树形DP] SRM 598 Div1 Hard TPS
- Codeforces Round #275 (Div. 1) D Random Function and Tree 树形dp
- [DP] SRM 452 Div1 Hard IncreasingNumber