动态规划专项intermediate:UVa 11600

一道求数学期望的dp,刚开始因为概率论没学好的缘故,连样例都看不懂……后来因为做了一道概率题,才明白了样例。做出来之后发现其实只是道水题……

先把连通分量都缩成一个点,然后就是简单的状压了。因为n到达30,数组开不下,所以我是用map实现状压的。

状态转移方程:dp[i][st]=(n-1)/(n-s)+sum{cnt[k]*dp[k][st^(1<

k表示未访问过的节点,cnt[k]表示节点所代表的连通分量所含的原节点数,s表示当前已连的节点所含的原节点总数。

这题还有个trick,就是样例是错的,不是输出一位小数,而应该是6位浮点数。

#include 
#include 
#include 
#include 
#include 
using namespace std;
vector g[35];
int vis[35],cnt[35];
int n,m,e;
map d[35];
void dfs(int u)
{
    vis[u]=1;
    cnt[e]++;
    for(int i=0;i>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++) g[i].clear();
        int u,v;
        while(m--)
        {
            cin>>u>>v;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        memset(vis,0,sizeof(vis));
        memset(cnt,0,sizeof(cnt));
        e=0;
        for(int i=1;i<=n;i++) if(!vis[i])
        {
            dfs(i);e++;
        }
        for(int i=0;i


你可能感兴趣的:(动态规划)