首先可以想到一个贪心的方法,然后一层一层的合并。

也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据。

交上去居然A掉了。

贪心

#include <cstdio>
#define F(i,j,k) for (int i=j;i<=k;++i)
int main()
{
int n,m,a;
scanf("%d",&n); a=0; m=n+1;
F(i,0,30) a+=(m>>i)&1; printf("%d\n",a-1);
a=0; m=n+1;
while (m>1)
{
if (m==2) a++,m=1;
else
{
switch(m%4)
{
case 1: a+=m/4*2-1;m/=4;m++;break;
case 2: a+=m/4*2; m/=4;m++;break;
case 3: a+=m/4*2+1;m/=4;m++;break;
case 0: a+=m/4*2; m/=4; break;
}
}
}
printf("%d\n",a);
}

动态规划

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define inf 0x3f3f3f3f
#define dinf -1044266559
int dp[5005][31][2],n,ans;// siz hiblack red/black
int main()
{
scanf("%d",&n); n=n*2+1;
memset(dp,0x3f,sizeof dp);
dp[1][1][1]=0;
for (int i=2;i<=n;++i)
for (int j=1;j<=i;++j)
{
if ((1<<j)>(n<<2)) break;
for (int k=1;k<=i-1;++k)
{
dp[i][j][0]=min(dp[i][j][0],dp[k][j][1]+dp[i-k-1][j][1]+1);
dp[i][j][1]=min(dp[i][j][1],dp[k][j-1][1]+dp[i-k-1][j-1][1]);
dp[i][j][1]=min(dp[i][j][1],dp[k][j-1][0]+dp[i-k-1][j-1][1]);
dp[i][j][1]=min(dp[i][j][1],dp[k][j-1][1]+dp[i-k-1][j-1][0]);
dp[i][j][1]=min(dp[i][j][1],dp[k][j-1][0]+dp[i-k-1][j-1][0]);
}
}
ans=inf;
F(i,0,n) ans=min(ans,min(dp[n][i][1],dp[n][i][0]));
printf("%d\n",ans); memset(dp,-0x3f,sizeof dp);
dp[1][1][1]=0;
for (int i=2;i<=n;++i)
for (int j=1;j<=i;++j)
{
if ((1<<j)>(n<<2)) break;
for (int k=1;k<=i-1;++k)
{
dp[i][j][0]=max(dp[i][j][0],dp[k][j][1]+dp[i-k-1][j][1]+1);
dp[i][j][1]=max(dp[i][j][1],dp[k][j-1][1]+dp[i-k-1][j-1][1]);
dp[i][j][1]=max(dp[i][j][1],dp[k][j-1][0]+dp[i-k-1][j-1][1]);
dp[i][j][1]=max(dp[i][j][1],dp[k][j-1][1]+dp[i-k-1][j-1][0]);
dp[i][j][1]=max(dp[i][j][1],dp[k][j-1][0]+dp[i-k-1][j-1][0]);
}
}
ans=0;
F(i,0,n) ans=max(ans,max(dp[n][i][1],dp[n][i][0]));
printf("%d\n",ans);
}

  

BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划的更多相关文章

  1. BZOJ 3227: [Sdoi2008]红黑树(tree)

    BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...

  2. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  3. Bzoj3227 [Sdoi2008]红黑树(tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 204  Solved: 125 Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染 ...

  4. [BZOJ 3227] [SDOI 2008] 红黑树(tree)

    Description 红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色.若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的前端结点.并规定所有前端结点的高度为- ...

  5. BZOJ3227 [sdoi2008]红黑树

    贪心什么的太神仙了( 老老实实dp于是就是沙茶题了 f[i][d][0/1]表示i个节点bh为d当前节点颜色白/黑[好好读题是真.. 转移一下然后就可以打表了( 由于我们发现这玩意很好卡有很好的性质( ...

  6. BZOJ-3227 红黑树(tree) 树形DP

    个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...

  7. 红黑树(二)之 C语言的实现

    概要 红黑树在日常的使用中比较常用,例如Java的TreeMap和TreeSet,C++的STL,以及Linux内核中都有用到.之前写过一篇文章专门介绍红黑树的理论知识,本文将给出红黑数的C语言的实现 ...

  8. 红黑树的C语言实现

    rbtree.h #ifndef _RED_BLACK_TREE_H_ #define _RED_BLACK_TREE_H_ #define RED 0 // 红色节点 #define BLACK 1 ...

  9. 物联网安全himqtt防火墙数据结构之红黑树源码分析

    物联网安全himqtt防火墙数据结构之红黑树源码分析 随着5G的发展,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWa ...

随机推荐

  1. 【extjs6学习笔记】0.0 准备

    1.下载ExtJS 6 下面是Ext JS 6正式版的GPL版本下载地址 https://www.sencha.com/legal/gpl/ 2.下载sencha cmd 安装完成后,命令行运行出现以 ...

  2. Spring下读取properties文件

    由于在spring的xml文件中配置了 <bean id="validator" class="org.springframework.validation.bea ...

  3. WebStorm 配置less

    1.打开Webstorm的Setting 搜索,watch 找到 File watch,点击右侧加号添加Less. 2.配置, working directory. Output paths

  4. python打飞机pro版

    # -*- coding: utf-8 -*- import pygame from sys import exit import random pygame.init() screen = pyga ...

  5. SpringBoot入门,新建SpringBoot项目

    一.在Spring Initializr中创建初始化项目 https://start.spring.io/ 二.通过maven导入Idea中(解压后的项目) 解压文件 黄色的为项目需要的真正的代码 , ...

  6. iOS UI 设计

    优设 http://www.uisdc.com Sketch http://www.sketchcn.com

  7. C# 读App.config配置文件[1]:.Net Framework框架

    C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 参考:https://www.cnblogs.com ...

  8. js的命令模式

    命令模式: 什么叫命令模式: 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式主要有四个部分: 命令对象(comma ...

  9. mysql查询数据包太大:max_allowed_packet

    查询大小: show variables like '%max_allowed_packet%'; 修改大小: set global max_allowed_packet = 1024 * 1024 ...

  10. MySQL binlog-server搭建

    MySQL binlog-server搭建 binlog在备份中起着至关重要的作用,备份binlog文件时,只能先在本地备份,然后才能传送到远程服务器上.从MySQL5.6版本后,可以利用mysqlb ...