zoukankan      html  css  js  c++  java
  • 【xsy1120】 支援(assist) dp+卡常

    妙啊算错时间复杂度了

    题目大意:给你一棵$n$个节点的二叉树,每个节点要么是叶子节点,要么拥有恰好两个儿子。

    令$m$为叶子节点个数,你需要在这棵二叉树中选择$i$个叶子节点染色,叶节点染色需要一定的代价,非叶子节点代价为两孩子的染色节点数量的异或和乘上一常数。请最小化代价。

    数据范围:$n≤4000$。

    显然这是一道$dp$题。

    令$f[u][i]$表示在以$u$号点为根的子树中,选择$i$个叶子节点染色的最小代价。

    若u为叶子节点,不难得出$f[u][0]=0$,$f[u][1]=c[u]$。

    我们不难得出$f[u][i+j]=min{f[lc][i]+f[rc][j]+c[u]*(i xor j)}$,其中$lc$,$rc$表示$u$的左儿子和右儿子,$c[u]$表示$u$号节点的常数。

    然后这个$dp$转移,看似是$O(n^3)$的,实际上:

    $T(n)=2T(frac{n}{2})+O(n^2)$。这个实际上还是$O(n^2)$的。。。。。。。。

    然后就愉快地做完了,注意卡常。

     1 #include<bits/stdc++.h>
     2 #define M 4005
     3 #define L long long
     4 #define INF (1<<28)
     5 using namespace std;
     6 int l[M]={0},r[M]={0},siz[M]={0},c[M]={0},vis[M]={0},f[M][M]={0};
     7 
     8 void dfs(int x){
     9     if(vis[x]) return; vis[x]=1;
    10     if(l[x]==0&&r[x]==0){
    11         siz[x]=1;
    12         f[x][0]=0; f[x][1]=c[x];
    13         return;
    14     }
    15     dfs(l[x]); dfs(r[x]);
    16     siz[x]=siz[l[x]]+siz[r[x]];
    17     for(int i=0;i<=siz[l[x]];i++){
    18         for(int j=0;j<=siz[r[x]];j++)
    19         f[x][i+j]=min(f[x][i+j],f[l[x]][i]+f[r[x]][j]+c[x]*(i^j));
    20     }
    21 }
    22 
    23 int Main(){
    24     memset(vis,0,sizeof(vis));
    25     int n; scanf("%d",&n);
    26     for(int i=1;i<=n;i++) scanf("%d%d",l+i,r+i);
    27     for(int i=1;i<=n;i++) scanf("%d",c+i);
    28     for(int i=1;i<=n;i++) memset(f[i],63,(n+1)<<2);
    29     for(int i=1;i<=n;i++) dfs(i);
    30     int rt=0; for(int i=1;i<=n;i++) if(siz[rt]<siz[i]) rt=i;
    31     for(int i=1;i<=siz[rt];i++)
    32         printf("%d ",f[rt][i]); 
    33     printf("
    ");
    34 }
    35 int main(){
    36     int cas; cin>>cas;
    37     while(cas--) Main();
    38 }
  • 相关阅读:
    JS时间自动更新
    浏览器一般兼容问题
    实现笛卡尔心形线的重复循环绘制
    js判断是否为ie6以外的浏览器,若是,则调用相应脚本
    html+css+js实现标签页切换
    实现跨浏览器的背景渐变
    IE8支持HTML5的占位符placeholder
    JS打造的跟随鼠标移动的酷炫拓扑图案
    JS获取阴历阳历和星期
    svn up时提示跳过某节点
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9820627.html
Copyright © 2011-2022 走看看