GDOI2016模拟8.10火星菌
2015-08-11 20:19
218 查看
题目大意:
对于一棵满二叉树,叶节点依次编号0~(2^k)-1,父节点的两颗子树可以任意旋转,这种方式生成的所有序列A2n−1{A_{2^
{n}-1}}中,求最小的Ans=∑W[Ai][Ai+1]\sum W[A_i][A_{i+1}](相邻两个叶节点取的编号为B)
我们可以发现,若将从根节点向左走为0,向右走为1,到达叶节点后得到的序列看做2进制的话,可以得到叶节点的初始编号0~(2^k)-1,作图后可以发现,相邻两个叶节点必然是从某一个公共祖先开始,一个走0,一个走1,假设我们现在想确定i这个位置的数,i-1为之前的相邻叶节点,那么i必然是走1的那边,而且这个1是其编号末尾的第一个1,这个可以用lowbit=i&-i得到。
那么知道这个有什么用呢?设i到lca(i,i-1)的路程为len,则从lca走0所得到的编号块与走1得到的编号块,能选的数在2^(len-1)(这个就是lowbit)这位必然不同,而后面的位可以随意,那么我们就可以从i-1的状态推到i的状态,易证这是没有后效性的。(可以yy一下)
那么我们设,f[i][j]为到i这个位置为止,选了j的序列得到的最小ANS,那么推到f[i+1][k],k的可取范围为:s=(j^lowbit)&~(lowbit-1),t=s+lowbit,[s,t)
贴代码:
对于一棵满二叉树,叶节点依次编号0~(2^k)-1,父节点的两颗子树可以任意旋转,这种方式生成的所有序列A2n−1{A_{2^
{n}-1}}中,求最小的Ans=∑W[Ai][Ai+1]\sum W[A_i][A_{i+1}](相邻两个叶节点取的编号为B)
我们可以发现,若将从根节点向左走为0,向右走为1,到达叶节点后得到的序列看做2进制的话,可以得到叶节点的初始编号0~(2^k)-1,作图后可以发现,相邻两个叶节点必然是从某一个公共祖先开始,一个走0,一个走1,假设我们现在想确定i这个位置的数,i-1为之前的相邻叶节点,那么i必然是走1的那边,而且这个1是其编号末尾的第一个1,这个可以用lowbit=i&-i得到。
那么知道这个有什么用呢?设i到lca(i,i-1)的路程为len,则从lca走0所得到的编号块与走1得到的编号块,能选的数在2^(len-1)(这个就是lowbit)这位必然不同,而后面的位可以随意,那么我们就可以从i-1的状态推到i的状态,易证这是没有后效性的。(可以yy一下)
那么我们设,f[i][j]为到i这个位置为止,选了j的序列得到的最小ANS,那么推到f[i+1][k],k的可取范围为:s=(j^lowbit)&~(lowbit-1),t=s+lowbit,[s,t)
贴代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 1000 #define MAXN 1000000000 #include<cmath> using namespace std; int n,ans; int f ,w ; void init(){ scanf("%d",&n); n=1<<n; for (int i=0;i<n;i++) for (int j=0;j<n;j++) scanf("%d",&w[i][j]); } void work(){ static int s,t,lowbit; fill(f[1],f[n+1],MAXN); for (int i=1;i<n;i++) for (int j=0;j<n;j++){ lowbit=i&-i; s=(j^lowbit)&~(lowbit-1); t=s+lowbit; for (int k=s;k<t;k++) f[i][k]=min(f[i][k],f[i-1][j]+w[j][k]); } ans=MAXN; for (int i=0;i<n;i++) ans=min(ans,f[n-1][i]); } void write(){ printf("%d",ans); } int main(){ init(); work(); write(); return 0; }
相关文章推荐
- tomcat启动加载
- 最长单调递增子序列
- 数据库日常维护-CheckList_02有关数据库备份检查
- Java用模板生成word
- PAT 1021. Deepest Root (25)
- Codeforces Round #315 (Div. 2)(A,B)
- 怎样安装虚拟机(VMware)
- 深入理解urllib、urllib2及requests
- UITableView 隐藏没有数据线条
- 29-HTML-12-HTML(表单组件-input)
- 29-HTML-13-HTML(表单组件-select&textarea)
- 滑雪(DP)
- Linux开发环境的搭建和使用——Linux 常用的命令使用
- TableView头视图
- 29-HTML-11-HTML(画中画标签)
- OGC之路(2) 之 Style之谜
- 关闭对话框重启还保留着上次的数据--MFC中如何把数据保存到注册表
- Python的getattr(),setattr(),delattr(),hasattr()
- Max Points on a Line
- 类的大小——sizeof 的研究(1)