换topcoder
2015-10-29 20:12
337 查看
10.29
最近刷leetcode刷的有点膨胀了
点开web Arena做第一题AB,瞬间AC,卧槽我宝刀未老!
点开一个550、卧槽。。
点开一个850、卧槽草草草。。
弄好了Arena 准备起飞
850的题目是 问N个节点(各不相同)的图,有多少有座桥。
今天做了一题,POJ1737
我又用了一种乱七八糟的方法,我也是醉了
这当然是过不了了。。时间复杂度比较高,然后高精度也没有上。
不过意思到了就行了
我想的是 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
先贴一个小数据版本的,妈蛋为了搞这个一晚上没有玩多塔
再来一个超时版本的O(N^5)
最近刷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 += 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 nodes with 1 component auto 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 += g[n - 1][c]; } } //f2 : n nodes with no bridge auto 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 = f1 ; 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 -= (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 [k] n nodes k bridges f3[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 [0] = f2 ; 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 [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 [k][1] = f3 [k]; for (int c = 2; c <= MaxN; c++) { for (int n1 = 1; n1 <= n;n1++) for (int k1 = 0; k1 <= k; k1++) f4 [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 [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 nodes with 1 component auto 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 ,g[n - 1][c]); } } //f2 : n nodes with no bridge auto 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 = f1 ; 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 ,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 [k] n nodes k bridges f3[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 [0] = f2 ; 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 [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 [k][1] = f3 [k]; for (int c = 2; c <= MaxN; c++) { for (int n1 = 1; n1 <= n;n1++) for (int k1 = 0; k1 <= k; k1++) adt(f4 [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 [k][c]); cout << ret << endl; } system("pause"); return 0; }
相关文章推荐
- shell script 学习笔记-----标准输出
- cento7 安装telnet
- Parallels Desktop 11 for Mac全新登场 支持Win10
- Linux调度浅析
- Mac 10.10安装hadoop 2.5.1
- CentOS6.7源码搭建LAMP平台
- hadoop2.6.1源码编译64位
- nginx easy 安装&简单分发配置
- Linux命令面试常考的简单汇总
- Linux文件和目录常用命令
- tomcat 配置内存
- linux kvm 创建虚拟机
- 网站开发进阶(八)tomcat异常日志分析及处理
- 网站开发进阶(八)tomcat异常日志分析及处理
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
- Julia: 引用、copy与数组
- Linux常用命令
- linux超级终端配置交换机路由器
- OpenJudge1249 Humble Numbers
- eclipse 中debug启动tomcat不能debug的问题