zoukankan      html  css  js  c++  java
  • HDU4219--Randomization?(树形概率DP)

    题意:https://blog.csdn.net/Umbrella__/article/details/78382710

    思路:

    首先dp【i】【j】保存的是,i节点到其叶子节点最大距离是j的合法概率。

    一开始,转移的时候我想:只保证两颗子树从根到叶子最大值相加合法是不是有错(因为一个子树内部可能还有更长的),其实这个不需要考虑,因为你要合并的这两个子树也是刚才合法得合并出来的。

    转移要用前缀优化一下max的那个东西,不然会TLE。

      1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
      2 #include <cstdio>//sprintf islower isupper
      3 #include <cstdlib>//malloc  exit strcat itoa system("cls")
      4 #include <iostream>//pair
      5 #include <fstream>//freopen("C:\Users\13606\Desktop\Input.txt","r",stdin);
      6 #include <bitset>
      7 //#include <map>
      8 //#include<unordered_map>
      9 #include <vector>
     10 #include <stack>
     11 #include <set>
     12 #include <string.h>//strstr substr strcat
     13 #include <string>
     14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
     15 #include <cmath>
     16 #include <deque>
     17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
     18 #include <vector>//emplace_back
     19 //#include <math.h>
     20 #include <cassert>
     21 #include <iomanip>
     22 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
     23 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
     24 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
     25 //******************
     26 clock_t __START,__END;
     27 double __TOTALTIME;
     28 void _MS(){__START=clock();}
     29 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
     30 //***********************
     31 #define rint register int
     32 #define fo(a,b,c) for(rint a=b;a<=c;++a)
     33 #define fr(a,b,c) for(rint a=b;a>=c;--a)
     34 #define mem(a,b) memset(a,b,sizeof(a))
     35 #define pr printf
     36 #define sc scanf
     37 #define ls rt<<1
     38 #define rs rt<<1|1
     39 typedef pair<int,int> PII;
     40 typedef vector<int> VI;
     41 typedef unsigned long long ull;
     42 typedef long long ll;
     43 typedef double db;
     44 const db E=2.718281828;
     45 const db PI=acos(-1.0);
     46 const ll INF=(1LL<<60);
     47 const int inf=(1<<30);
     48 const db ESP=1e-9;
     49 const int mod=(int)1e9+7;
     50 const int N=(int)1e6+10;
     51 
     52 int n,L,S;
     53 db p;
     54 //==========================================================================================
     55 db dp[70][550];
     56 vector<vector<int> >G(100);
     57 int maxx(int a,int b)
     58 {
     59     return a>b?a:b;
     60 }
     61 
     62 void dfs(int u,int fa)
     63 {
     64     int sz=G[u].size();
     65     for(int i=0;i<sz;++i)
     66     {
     67         int to=G[u][i];
     68         if(to==fa)continue;
     69         dfs(to,u);
     70         db temp[550];
     71         mem(temp,0);
     72         db ko[550];
     73         mem(ko,0);
     74         for(int j=0;j<=520;++j)
     75             for(int o=0;o<=L;++o)
     76                 ko[j+o]+=p*dp[to][j];
     77         db kopre[550];kopre[0]=ko[0];
     78         for(int j=1;j<=520;++j)kopre[j]=kopre[j-1]+ko[j];
     79         db jpre[550];jpre[0]=dp[u][0];
     80         for(int j=1;j<=520;++j)jpre[j]=jpre[j-1]+dp[u][j];
     81         for(int j=0;j<=S;++j)
     82         {
     83             int min_=min(j,S-j);
     84             temp[j]+=dp[u][j]*kopre[min_];
     85             temp[j]+=jpre[min_]*ko[j];
     86             if(j*2<=S)temp[j]-=dp[u][j]*ko[j];//减去j*j这个重复的,但是j*2>S肯定不会出现j*j这个
     87         }
     88 /*
     89         for(int j=0;j<=520;++j)
     90             for(int k=0;k<=520;++k)
     91                 for(int o=0;o<=L;++o)
     92                     if(j+k+o<=S)
     93                         temp[maxx(j,k+o)]+=p*dp[u][j]*dp[to][k];
     94 */
     95         for(int j=0;j<=520;++j)
     96             dp[u][j]=temp[j];
     97     }
     98 }
     99 int tot=0;
    100 void solve()
    101 {
    102     mem(dp,0);
    103     sc("%d%d%d",&n,&L,&S);p=1.0/(L+1.0);
    104     for(int i=1;i<=n;++i)dp[i][0]=1,G[i].clear();
    105     for(int i=1;i<n;++i)
    106     {
    107         int u,v;
    108         sc("%d%d",&u,&v);
    109         G[u].push_back(v);
    110         G[v].push_back(u);
    111     }
    112     dfs(1,0);
    113     db ans=0;
    114     for(int i=0;i<550;++i)ans+=dp[1][i];
    115     pr("Case %d: %.6lf
    ",++tot,ans);
    116 }
    117 
    118 int main()
    119 {
    120     int T;
    121     sc("%d",&T);
    122     while(T--)solve();
    123     return 0;
    124 }
    125 
    126 /**************************************************************************************/
  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/--HPY-7m/p/12350200.html
Copyright © 2011-2022 走看看