zoukankan      html  css  js  c++  java
  • 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp

    LINK:网络收费

    还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了.

    没有合理的转换问题的模型是我整个人最大的败笔.

    暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 连图都不用建出来.

    不是传统的树形dp 因为子树的状态影响之后的决策 并且从下至上的话需要状压所有点的状态 从上之下的话代价难以统计。

    观察图中的这张表格 容易发现有规律的事情 当 na<nb时 有A的一定付出代价 两个A的话就两倍 一个A的话就一倍 B的话不要代价。

    容易转换成上述模型 于是 这个点的颜色还是为 子树内A和B谁多的问题。

    还是考虑树形dp 考虑从下至上 发现还是难以统计答案。从上之下 发现可以统计答案了 不过存在不合法 对于不合法的状态扔掉即可。

    说起来这类似于爆搜 只搜路径上的点的状态 然后进行合并 由于前面的状态被搜过 后面保证所有状态也被搜了一遍 所以可以发现爆搜出了所有的状态.

    合并的时候 其实类似背包。非常巧妙的题目。

    const int MAXN=2100;
    int n,m,maxx,ans=INF,top;
    int w[MAXN][MAXN],s[MAXN],q[MAXN],vis[MAXN],a[MAXN],c[MAXN],b[MAXN][MAXN];
    int f[MAXN][MAXN],sz[MAXN];//f[i][j]表示以i为根的子树内B的点数为j的最小代价.
    inline int LCA(int x,int y)
    {
    	while(x!=y)
    	{
    		x>>=1;
    		y>>=1;
    	}
    	return x;
    }
    inline void dfs(int x,int dep)
    {
    	rep(0,sz[x],j)f[x][j]=INF;
    	if(dep==n)
    	{
    		f[x][0]=f[x][1]=0;
    		fep(top,1,i)
    		{
    			if(s[i]!=a[x])f[x][a[x]]+=w[x][q[i]];
    			else f[x][a[x]^1]+=w[x][q[i]];
    		}
    		f[x][a[x]^1]+=c[x];
    		return;
    	}
    	s[++top]=1;q[top]=x;
    	dfs(x<<1,dep+1);
    	dfs(x<<1|1,dep+1);
    	rep(0,sz[x<<1],i)rep(0,sz[x<<1|1],j)
    		if(i+j>sz[x]-i-j)f[x][i+j]=min(f[x][i+j],f[x<<1][i]+f[x<<1|1][j]);
    	s[top]=0,q[top]=x;
    	dfs(x<<1,dep+1);
    	dfs(x<<1|1,dep+1);
    	rep(0,sz[x<<1],i)rep(0,sz[x<<1|1],j)if(i+j<=sz[x]-i-j)f[x][i+j]=min(f[x][i+j],f[x<<1][i]+f[x<<1|1][j]);
    	--top;
    }
    int main()
    {
    	freopen("1.in","r",stdin);
    	get(n);m=1<<n;maxx=(1<<n+1)-1;
    	rep(m,maxx,i)get(a[i]),sz[i]=1;
    	rep(m,maxx,i)get(c[i]);
    	rep(m,maxx,i)rep(i+1,maxx,j)get(b[i][j]);
    	rep(m,maxx,i)rep(i+1,maxx,j)
    	{
    		int lca=LCA(i,j);
    		w[i][lca]+=b[i][j];
    		w[j][lca]+=b[i][j];
    	}
    	fep(maxx,1,i)if((i<<1|1)<=maxx)sz[i]=sz[i<<1|1]+sz[i<<1];
    	dfs(1,0);rep(0,sz[1],i)ans=min(ans,f[1][i]);put(ans);return 0;
    }
    
  • 相关阅读:
    说实话,mycat就是垃圾,不再更新
    深入理解并发/并行,阻塞/非阻塞,同步/异步
    转载:PHP 协程实现
    转载:异步、并发、协程原理
    第四章总结
    第三节 需要异常
    [第四章] 测试依赖性和异常
    第三章总结
    第三节 MVC应用程序架构和测试
    第二节 PHPUnit测试的剖析
  • 原文地址:https://www.cnblogs.com/chdy/p/12932756.html
Copyright © 2011-2022 走看看