标签:
10.29
最近刷leetcode刷的有点膨胀了
点开web Arena做第一题AB,瞬间AC,卧槽我宝刀未老!
点开一个550、卧槽。。
点开一个850、卧槽草草草。。
弄好了Arena 准备起飞
850的题目是 问N个节点(各不相同)的图,有多少有座桥。
今天做了一题,POJ1737
我又用了一种乱七八糟的方法,我也是醉了
#include<iostream> #include<algorithm> #include<map> #include<unordered_map> #include<vector> #include<string> #include<stack> #include<queue> using namespace std; const int MaxN = 50; int main() { vector<long long> f = vector<long long>(MaxN + 1, 0); vector<vector<long long>> g = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)); vector<vector<long long>> c = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)); c[0][0] = 1; for (int i = 1; i <= MaxN; i++) { c[i][0] = c[i][i] = 1; for (int j = 1; j <= i-1; j++) c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; } // g[0][0] = 1; // f[1] = 1; for (int n = 2; n <= MaxN; n++) { //g[n-1,n-1] for (int k = 1; k <= n - 1; k++) { for (int s1 = 1; s1 <= n - 1; s1++) g[n - 1][k] += ((1 << s1) - 1)*f[s1] * c[n - 2][s1 - 1] * g[n - 1 - s1][k - 1]; f[n] += g[n - 1][k]; } } int X; while (cin >> X) { if (!X) break; cout << f[X] << endl; } return 0; }
这当然是过不了了。。时间复杂度比较高,然后高精度也没有上。
不过意思到了就行了
我想的是 1连的那个连通分支有哪些点,用dp套一个dp
看了别人的解答:
设f(n)为所求答案
g(n)为n个顶点的非联通图
则f(n) + g(n) = h(n) = 2^(n * (n - 1) / 2)
其中h(n)是n个顶点的联图的个数
这样计算
先考虑1所在的连通分量包含哪些顶点
假设该连通分量有k个顶点
就有C(n - 1, k - 1)种集合
确定点集后,所在的连通分量有f(k)种情况。其他连通分量有 h(n - k)种情况
因此有递推公式。g(n) = sum{ C(n - 1, k - 1) * f(k) * h(n - k)} 其中k = 1,2...n-1
注意每次计算出g(n)后立刻算出f(n)
好吧 我那个做法也许是有一些借鉴意义的。。毕竟。。难想到。。
标签:
原文地址:http://www.cnblogs.com/soya/p/4921694.html