当前位置: 首页 > news >正文

[IOI2007 D1T1]Miners 矿工配餐

题目大意:有$2$个煤矿,$n$天。每天给一个煤矿送餐(共有有$3$种餐),价值为它与前面两次送餐(如果有的话)不同的种类数。最大化价值。

题解:看到只有三种餐,考虑状压$DP$。$f_{i,j,k,l,m}$表示现在是第$i$天,第一个煤矿上一次为$j$,再上一次为$k$(没有为$0$),$l,m$同理。

$$(calc(a,b,c)为求出这三个数中有多少种不为0的数)$$

$$f_{i,s_i,j,l,m} = f_{i-1,j,k,l,m} + calc(s_i,j,k)(如果f_{i-1,j,k,l,m}存在)$$

$$f_{i,j,k,s_i,l} = f_{i-1,j,k,l,m} + calc(s_i,l,m)(如果f_{i-1,j,k,l,m}存在)$$

卡点:1.加了一个假的优化

 

C++ Code:

#include <cstdio>
#include <cstring>
#define maxn 100010
using namespace std;
int f[2][4][4][4][4], n, s[maxn], ans;
bool v[2][4][4][4][4];
int now = 1, past = 0;
char ch[maxn];
void up(int &a, int b) {
	if (b > a) a = b;
}
int tmp[4];
int calc(int a, int b, int c) {
	memset(tmp, 0, sizeof tmp);
	tmp[a] = tmp[b] = tmp[c] = 1;
	return tmp[1] + tmp[2] + tmp[3];
}
int main() {
	scanf("%d", &n);
	scanf("%s", ch + 1);
	for (int i = 1; i <= n; i++) s[i] = (ch[i] == 'B' ? 3 : (ch[i] == 'M' ? 1 : 2));
	v[now][0][0][0][0] = true;
	for (int i = 1; i <= n; i++) {
		now ^= past ^= now ^= past;
		memset(f[now], 0, sizeof f[now]);
		memset(v[now], false, sizeof v[now]);
		for (int j = 0; j < 4; j++) {
			for (int k = 0; k < 4; k++) {
				for (int l = 0; l < 4; l++) {
					for (int m = 0; m < 4; m++) {
						if (v[past][j][k][l][m]) {
							up(f[now][s[i]][j][l][m], f[past][j][k][l][m] + calc(s[i], j, k));
							up(f[now][j][k][s[i]][l], f[past][j][k][l][m] + calc(s[i], l, m));
							v[now][s[i]][j][l][m] = true;
							v[now][j][k][s[i]][l] = true;
						}
					}
				}
			}
		}
	}
	for (int i = 0; i < 4; i++) 
		for (int j = (i != 0); j < 4; j++)
			for (int k = 0; k < 4; k++)
				for (int l = (k != 0); l < 4; l++) up(ans, f[now][i][j][k][l]);
	printf("%d\n", ans);
	return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9460278.html

相关文章:

  • 10.监视SQL Server性能
  • QEMU增量镜像制作
  • SpringBoot 核心模块原理剖析
  • Confluence 6 的小型文字档案(Cookies)
  • WPF中使用amCharts绘制股票K线图
  • 装饰者模式--穿什么有这么重要?
  • 健身:手臂训练
  • SQLServer------查询结果为空的列赋默认值
  • 精简分页组件(手写)
  • Flutter 06:【小插曲】请慎重升级最新版本 AndroidStudio
  • 分页查询对象列表ListT findListByPage运用
  • centos /linux 修改目录或文件权限
  • Npm 多模块依赖解决方案
  • isset在php5.6-和php7.0+的一些差异
  • Nginx支持WebSocket反向代理-学习小结
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • E-HPC支持多队列管理和自动伸缩
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue--为什么data属性必须是一个函数
  • 从零开始在ubuntu上搭建node开发环境
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何学习JavaEE,项目又该如何做?
  • 新书推荐|Windows黑客编程技术详解
  • 硬币翻转问题,区间操作
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​人工智能书单(数学基础篇)
  • # 透过事物看本质的能力怎么培养?
  • #Spring-boot高级
  • $.ajax()方法详解
  • (8)STL算法之替换
  • (C#)一个最简单的链表类
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (分布式缓存)Redis持久化
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)iOS字体
  • (转)我也是一只IT小小鸟
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Web窗口页属性
  • .NET 服务 ServiceController
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • @Valid和@NotNull字段校验使用
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [20171102]视图v$session中process字段含义
  • [AIGC] 如何建立和优化你的工作流?
  • [Android Pro] AndroidX重构和映射
  • [bzoj 3534][Sdoi2014] 重建
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [codevs] 1029 遍历问题
  • [CTF]2022美团CTF WEB WP
  • [DL]深度学习_Feature Pyramid Network
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)