换topcoder
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)
?
好吧 我那個做法也許是有一些借鑒意義的。。畢竟。。難想到。。
11.8
先貼一個小數據版本的,媽蛋為了搞這個一晚上沒有玩多塔
#define _CRT_SECURE_NO_WARNINGS#include<iostream> #include<algorithm> #include<map> #include<unordered_map> #include<vector> #include<string> #include<stack> #include<queue>using namespace std;const int MaxN = 15; const long long Modulo = 1000000007;vector<vector<long long>> calcComb() {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]) % Modulo;}return c; }long long pow(int s1, int c) {long long ret = 1;while (c--) ret *= s1;return ret; }int main() {auto C = calcComb();//calc f1[n] : n nodes with 1 componentauto f1 = vector<long long>(MaxN + 1, 0);auto g = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0));g[0][0] = 1;f1[1] = 1;for (int n = 2; n <= MaxN; n++){for (int c = 1; c <= n - 1; c++) // c components {for (int s1 = 1; s1 <= n - 1; s1++)g[n - 1][c] += ((1 << s1) - 1) * f1[s1] * C[n - 2][s1 - 1] * g[n - 1 - s1][c - 1];f1[n] += g[n - 1][c];}}//f2[n]: n nodes with no bridgeauto f2 = vector<long long>(MaxN + 1, 0);g = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0));g[0][0] = 1;f2[0] = 1;for (int n = 1; n <= MaxN; n++){f2[n] = f1[n];for (int c = 1; c <= n - 1; c++){for (int s1 = 1; s1 <= n - 1; s1++)g[n - 1][c] += (s1 * C[n - 2][s1 - 1] * f1[s1] * g[n - 1 - s1][c - 1]);}for (int s1 = 1; s1 <= n - 1; s1++){for (int c = 1; c <= n - 1;c++)f2[n] -= (C[n - 1][s1 - 1] * f2[s1] * /*/ 激動的快哭了,找到個bug的時候,沒有乘 /*/pow(s1,c) * g[n - s1][c]);}}auto f3 = vector<vector<long long>>(MaxN + 1,vector<long long>(MaxN + 1,0));//f3[n][k] n nodes k bridgesf3[0][0] = 1;auto gg = vector<vector<vector<long long>>>(MaxN + 1, vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)));gg[0][0][0] = 1;for (int n = 1; n <= MaxN; n++){f3[n][0] = f2[n];for (int k = 1; k <= MaxN; k++){for (int c = 1; c <= n - 1;c++)for (int n1 = 1; n1 <= n - 1;n1++)for (int k1 = 0; k1 < k; k1++){gg[n - 1][k][c] += n1 * C[n-2][n1-1] * f3[n1][k1] * gg[n - 1 - n1][k - k1 - 1][c - 1];}for (int n1 = 1; n1 <= n - 1; n1++){for (int c = 1; c <= n; c++)f3[n][k] += C[n - 1][n1 - 1] * f2[n1] * /*還TM漏一個*/pow(n1,c) * gg[n - n1][k][c];}}}auto f4 = vector<vector<vector<long long>>>(MaxN + 1, vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)));f4[0][0][0] = 1;for (int n = 1; n <= MaxN; n++)for (int k = 0; k < MaxN; k++){f4[n][k][1] = f3[n][k];for (int c = 2; c <= MaxN; c++){for (int n1 = 1; n1 <= n;n1++)for (int k1 = 0; k1 <= k; k1++)f4[n][k][c] += f3[n1][k1] * C[n - 1][n1 - 1] * f4[n - n1][k - k1][c-1];}}int n, k;while (cin >> n >> k){int ret = 0;for (int c = 1; c <= n; c++)ret += f4[n][k][c];cout << ret << endl;}system("pause");return 0; }?再來一個超時版本的O(N^5)
#define _CRT_SECURE_NO_WARNINGS#include<iostream> #include<algorithm> #include<map> #include<unordered_map> #include<vector> #include<string> #include<stack> #include<queue>using namespace std;const int MaxN = 50; const long long M = 1000000007;long long mul(long long A, long long B) {return (A % M) * (B % M) % M; }void adt(long long& x, long long a) {x = (x + a) % M; }vector<vector<long long>> calcComb() {auto 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]) % M;}return c; }vector<vector<long long>> calcPow() {auto p = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0));for (int i = 1; i <= MaxN; i++){p[i][0] = 1;for (int j = 1; j <= MaxN; j++) p[i][j] = mul(i,p[i][j-1]);}return p; }int main() {auto C = calcComb();auto POW = calcPow();//calc f1[n] : n nodes with 1 componentauto f1 = vector<long long>(MaxN + 1, 0);auto g = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0));g[0][0] = 1;f1[1] = 1;for (int n = 2; n <= MaxN; n++){for (int c = 1; c <= n - 1; c++) // c components {for (int s1 = 1; s1 <= n - 1; s1++)g[n - 1][c] += mul(mul(mul((pow(2,s1) - 1),f1[s1]),C[n - 2][s1 - 1]),g[n - 1 - s1][c - 1]);adt(f1[n],g[n - 1][c]);}}//f2[n]: n nodes with no bridgeauto f2 = vector<long long>(MaxN + 1, 0);g = vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0));g[0][0] = 1;f2[0] = 1;for (int n = 1; n <= MaxN; n++){f2[n] = f1[n];for (int c = 1; c <= n - 1; c++){for (int s1 = 1; s1 <= n - 1; s1++)adt(g[n - 1][c],mul(mul(mul(s1, C[n - 2][s1 - 1]),f1[s1]),g[n - 1 - s1][c - 1]));}for (int s1 = 1; s1 <= n - 1; s1++){for (int c = 1; c <= n - 1;c++)adt(f2[n],M-mul(mul(mul(C[n - 1][s1 - 1],f2[s1]),/*/ 激動的快哭了,找到個bug的時候,沒有乘 /*/POW[s1][c]),g[n - s1][c]));}}auto f3 = vector<vector<long long>>(MaxN + 1,vector<long long>(MaxN + 1,0));//f3[n][k] n nodes k bridgesf3[0][0] = 1;auto gg = vector<vector<vector<long long>>>(MaxN + 1, vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)));gg[0][0][0] = 1;for (int n = 1; n <= MaxN; n++){f3[n][0] = f2[n];for (int k = 1; k <= MaxN; k++){for (int c = 1; c <= n - 1;c++)for (int n1 = 1; n1 <= n - 1;n1++)for (int k1 = 0; k1 < k; k1++){adt(gg[n - 1][k][c],mul(mul(mul(n1,C[n-2][n1-1]),f3[n1][k1]),gg[n - 1 - n1][k - k1 - 1][c - 1]));}for (int n1 = 1; n1 <= n - 1; n1++){for (int c = 1; c <= n; c++)adt(f3[n][k],mul(mul(mul(C[n - 1][n1 - 1],f2[n1]), /*還TM漏一個*/POW[n1][c]),gg[n - n1][k][c]));}}}auto f4 = vector<vector<vector<long long>>>(MaxN + 1, vector<vector<long long>>(MaxN + 1, vector<long long>(MaxN + 1, 0)));f4[0][0][0] = 1;for (int n = 1; n <= MaxN; n++)for (int k = 0; k < MaxN; k++){f4[n][k][1] = f3[n][k];for (int c = 2; c <= MaxN; c++){for (int n1 = 1; n1 <= n;n1++)for (int k1 = 0; k1 <= k; k1++)adt(f4[n][k][c],mul(mul(f3[n1][k1],C[n - 1][n1 - 1]),f4[n - n1][k - k1][c-1]));}}int n, k;while (cin >> n >> k){long long ret = 0;for (int c = 1; c <= n; c++)adt(ret,f4[n][k][c]);cout << ret << endl;}system("pause");return 0; }?
轉載于:https://www.cnblogs.com/soya/p/4921694.html
總結
- 上一篇: LeetCode Search Ins
- 下一篇: 如何使用postman做接口测试