bzoj1495 [NOI2006] 网络收费 树形DP
来源:互联网 发布:淘宝口令在什么位置 编辑:程序博客网 时间:2024/06/10 23:33
ps:bzoj上的题目是不完整的欸。
你应该同时去bzoj和codevs上看这道题,结合一下基本就可以懂了。
简单描述:
一棵有
2n(m) 个节点的满二叉树,每个节点有一个颜色A或B,对于树上一个非叶子节点x,如果以x为根的子树上A颜色的节点的数量多,就让x的属性为A付费,否则为B付费。对于任意两点i,j,有一个流量Fij ,它们的最近公共祖先为x,如果x与i的属性相同,就要付一倍流量,如果x与j属性相同,也要付一倍流量(所以最多的可以付两倍流量)。但是节点可以付费更改自己的颜色,求如何让所有节点付的流量总和最小。(n<=10)
(你看这个题面不就好了很多嘛)(然而还是看了题解因为不看题解看不懂题啊)
现在我们就可以方便得处理出一个节点祖先和孩子的状态了。定义
然后我们用记忆化搜索,
开始普通背包,处理叶子节点的边界(及叶子节点到其所有祖先的花费)。
(本来到这里是经过了推论和简化的,省掉它吧)
#include<algorithm>#include<cstring>#include<cstdio>using namespace std;const int oo=~0U>>1;const int N=1000+100;struct Node { int v[N<<1],bs; int& operator () (int i,int j) {return v[i*bs+j];};} f[N<<1];int n,m,ans=oo,c[N],type[N],fa[N][N],cost[N][N],flow[N][N];template <class T> void read(T &x) { x=0;int f=1;char ch=getchar(); for(;ch<'0'||ch>'9';) {if(ch=='-') f=-1;ch=getchar();} for(;ch>='0'&&ch<='9';) x=x*10+ch-'0',ch=getchar(); x*=f;}template <class T> void write(T x) { int num=0;char ch[20]; if(x<0) putchar('-'),x=-x; do ch[++num]=x%10+'0',x/=10; while(x); for(;num;) putchar(ch[num--]);}int clac(int x,int j,int k) { int i,ca=0,cb=0; for(i=1;i<=n;i++) { if(k&1) ca+=cost[i][x]; else cb+=cost[i][x]; k>>=1; } if(j) return ca+(type[x]?0:c[x]); return cb+(type[x]?c[x]:0);}int dp(int i,int j,int k,int h) { int l,ls,tk,now,ret=f[i](j,k); if(ret) return ret; if(h) { ret=oo,now=j<((1<<h)-j); for(tk=(k<<1)+now,ls=1<<h-1,l=(j-ls<0?0:j-ls);l<=ls&&l<=j;l++) ret=min(ret,dp(i<<1,l,tk,h-1)+dp(i<<1|1,j-l,tk,h-1)); } else ret=clac(i-m+1,j,k); f[i](j,k)=ret; return ret;}int main() { int i,j,a,k; for(read(n),m=1<<n,i=1;i<=m;i++) read(a),type[i]=a==0; for(i=1;i<=m;i++) read(c[i]); for(i=1;i<=m;i++) for(j=i+1;j<=m;j++) read(a),flow[i][j]=flow[j][i]=a; for(i=1;i<=m;i++) for(k=i+m-1,j=1;j<=n;j++) k>>=1,fa[j][i]=k; for(i=1;i<=n+1;i++) for(j=1<<i-1;j<=(1<<i)-1;j++) f[j].bs=1<<i-1; for(i=1;i<=m;i++) for(j=i+1;j<=m;j++) for(k=1;k<=n;k++) if(fa[k][i]==fa[k][j]) {cost[k][i]+=flow[i][j],cost[k][j]+=flow[i][j];break;} for(i=0;i<=m;i++) ans=min(ans,dp(1,i,0,n)); write(ans);putchar('\n'); return 0;}
阅读全文
0 0
- bzoj1495 [NOI2006] 网络收费 树形DP
- NOI2006 网络收费 network
- [NOI2006]网络收费
- bzoj 1495: [NOI2006]网络收费
- 【树型状态压缩动态规划】【NOI2006】网络收费
- NOI2006 最大获利(网络流)
- 【NOI2006】最大获利 网络流
- 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp
- BZOJ1596: [Usaco2008 Jan]电话网络 树形DP
- 【XSY1602】安全网络 树形DP 数学
- NOI2006最大获利 网络流模型备忘
- [BZOJ1497] [NOI2006] 最大获利 - 网络流
- 【BZOJ】1497 [NOI2006]最大获利 网络流
- bzoj1497: [NOI2006]最大获利(网络流)
- 树形dp
- 树形DP
- 树形dp
- 树形DP
- Iterator_traits
- s3c2440 watchdog驱动
- leetcode No72. Edit Distance
- 优秀产品经理的核心技能
- 详解Mabitis中的#与$符号区别及用法介绍
- bzoj1495 [NOI2006] 网络收费 树形DP
- 子串
- 切割网线
- 子串
- 如何转载csdn文章
- Spring中的bean管理
- Implement strStr()
- Java_Ant详解
- Android MediaProjection 录屏