码迷,mamicode.com
首页 > 其他好文 > 详细

换topcoder

时间:2015-10-29 21:37:59      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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)

 

好吧 我那个做法也许是有一些借鉴意义的。。毕竟。。难想到。。

换topcoder

标签:

原文地址:http://www.cnblogs.com/soya/p/4921694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!