C. Garland
时间:2020-01-07
本文章向大家介绍C. Garland,主要包括C. Garland使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
思路:
dp[k][h][w][z] 表示剩余0-k节点,基数点剩余h个,偶数点剩余w个,k点为z(奇/偶) 的情况下的最优值。
其中w可以省略掉因为可以根据k和h计算出w,为了方便写计算留下了w。
代码:
#include <iostream> #include <string> #include <string.h> #include <stdio.h> #include <algorithm> #include <map> using namespace std; const int N = 101; int a[N]; int dp[N][N][N][2]; int n; int dfs(int k, int h, int w, int z) { if (dp[k][h][w][z] != -1) { return dp[k][h][w][z]; } if (k == 0) { if ((z == 1 && (a[k] == 0 || a[k]&0x01)) && h > 0) return (dp[k][h][w][z] = 0); if ((z == 0 && (a[k] == 0 || !(a[k]&0x01))) && w > 0) return (dp[k][h][w][z] = 0); return (dp[k][h][w][z] = N); } dp[k][h][w][z] = N; if(a[k] == 0) { if (z == 1 && h > 0) { if (h > 1) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 1)); } if (w > 0) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 0) + 1); } } if (z == 0 && w > 0) { if (w > 1) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 0)); } if (h > 0) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 1) + 1); } } } else if(a[k]&0x01) { if (z == 1 && h > 0) { if (h > 1) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 1)); } if (w > 0) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h-1, w, 0) + 1); } } } else { if (z == 0 && w > 0) { if (w > 1) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 0)); } if (h > 0) { dp[k][h][w][z] = min(dp[k][h][w][z], dfs(k-1, h, w-1, 1) + 1); } } } //cout << k <<" " <<h << " " << w << " " << z << " " << dp[k][h][w][z] << endl; return dp[k][h][w][z]; } int main() { while(cin>>n) { for (int i = 0; i < n; ++i) { cin>>a[i]; } if (n == 1) { cout << 0 << endl; continue; } if (n == 2) { cout << 1 << endl; continue; } memset(dp, -1, sizeof(dp)); int h = n >> 1; if (n&0x01) { h ++; } cout << min(dfs(n-1, h, n-h, 1), dfs(n-1, h, n-h, 0)) << endl; } return 0; }
原文地址:https://www.cnblogs.com/liulangye/p/12161822.html
- zookeeper监控告警
- 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip
- Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)
- Linux同步机制 - 多线程开发总结
- 谷歌发布升级版语音合成系统,直接从字符合成语音
- 无锁编程 - 大纲
- 无锁编程(一) - Double-checked Locking
- 无锁编程(二) - 原子操作
- 我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离
- 无锁编程(三) - 忙等待
- Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug
- 无锁编程(四) - CAS与ABA问题
- Linux Kernel CMPXCHG函数分析
- 无锁编程(五) - RCU(Read-Copy-Update)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GO 文档笔记
- 魔改npm私有仓库 | Verdaccio教程
- 【Vulnhub】AI Web 2.0
- Python迭代器和生成器
- Python深层解析json数据之JsonPath
- Linux 下的 pstack 工具安装及简单应用
- range函数小应用
- 今日算法题,请查收
- 如何将根证书预置到 firefox 浏览器发布包中
- Vue + Flask 实战开发系列(九)
- 推荐几款快速管理 Kubernetes 多集群环境的神器
- 1. 初识Jackson -- 世界上最好的JSON库
- 实时应用程序中checkpoint语义以及获取最新offset
- Python2.6低版本Python如何实现爬虫功能
- python开发web服务 bottle框架