题意简述

有两个矿洞,已知食物的种类(≤3)和顺序,将他们送往任一矿洞,

若一个矿洞3次食物相同,贡献1;若有2种不同食物,贡献2;若有3种不同食物,贡献3

求最大贡献

题解思路

food[i] 为当前食物

dp[i][i1][i2][i3][i4]表示当前是第i个食物,第一个矿洞前两次食物为i1, i2,第二个矿洞前两次食物为i3, i4

dp[i][i2][food[i]][i3][i4] = (dp[i - 1][i1][i2][i3][i4] + (i1, i2, food[i]) 的贡献, dp[i][i2][food[i]][i3][i4]);

dp[i][i1][i2][i4][food[i]] = (dp[i - 1][i1][i2][i3][i4] + (i3, i4, food[i]) 的贡献, dp[i][i1][i2][i4][food[i]]);

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, ans;
int food[100010];
int dp[2][4][4][4][4];
char ch;
void maxx(int &x, int y) {x = max(x, y); }
int calc(int x, int y, int z) {return (y && y != z) + (x && x != y && x != z) + 1; }
int main()
{
scanf("%d", &n);
for (register int i = 1; i <= n; ++i)
{
cin >> ch;
food[i] = ch == 'M' ? 1 : ch == 'F' ? 2 : 3;
}
memset(dp, -1, sizeof dp);
dp[0][0][0][0][0] = 0;
for (register int i = 1; i <= n ;++i)
for (register int i1 = 0; i1 <= 3; ++i1)
for (register int i2 = 0; i2 <= 3; ++i2)
for (register int i3 = 0; i3 <= 3; ++i3)
for (register int i4 = 0; i4 <= 3; ++i4)
if (dp[(i - 1) & 1][i1][i2][i3][i4] != -1)
{
maxx(dp[i & 1][i2][food[i]][i3][i4], dp[(i - 1) & 1][i1][i2][i3][i4] + calc(i1, i2, food[i]));
maxx(dp[i & 1][i1][i2][i4][food[i]], dp[(i - 1) & 1][i1][i2][i3][i4] + calc(i3, i4, food[i]));
}
for (register int i1 = 0; i1 <= 3; ++i1)
for (register int i2 = 0; i2 <= 3; ++i2)
for (register int i3 = 0; i3 <= 3; ++i3)
for (register int i4 = 0; i4 <= 3; ++i4)
maxx(ans, dp[n & 1][i1][i2][i3][i4]);
printf("%d\n", ans);
}

洛谷 P4401 [IOI2007]Miners 矿工配餐的更多相关文章

  1. [Ioi2007]Miners 矿工配餐(BZOJ1806)

    [Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两 ...

  2. BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )

    dp... ------------------------------------------------------------------------------- #include<cs ...

  3. bzoj1806 [Ioi2007]Miners矿工配餐

    [bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...

  4. [bzoj1806] [ioi2007]Miners 矿工配餐

    相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...

  5. BZOJ 1806: [Ioi2007]Miners 矿工配餐

    ime Limit: 10 Sec  Memory Limit: 64 MBSubmit: 910  Solved: 559[Submit][Status][Discuss] Description ...

  6. bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...

  7. BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划

    题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一 ...

  8. [IOI2007]Miners 矿工配餐

    link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...

  9. 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp

    题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...

随机推荐

  1. Spring IoC控制反转创建实例

    Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...

  2. C#类型详解

    一.类型成员 类成员定义有(public.private.internal.protected). Public--对任何类和成员都是公开的,无限制 Private--是私有的,仅能由类内部代码访问, ...

  3. 牛客小白月赛16 E 小雨的矩阵 ( 暴搜)

    链接:https://ac.nowcoder.com/acm/contest/949/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  4. 数据结构与算法---堆排序(Heap sort)

    堆排序基本介绍 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序. 2.堆是具有以下性质的完全二叉树:每个 ...

  5. Ubuntu 18.04 root 使用ssh密钥远程登陆

    前言: Ubuntu默认是禁止root用户远程登陆 本教程解决Ubuntu 18.04版本 root用户 使用ssh密钥无法远程登陆的问题 问题发生的环境: 腾讯云,重装Ubuntu服务器时选择使用s ...

  6. VNC服务配置

    Windows通过VNC远程桌面访问Ubuntu设备:一个WIN7的机器,一个系统为Ubuntu的机器 (二者可以均可为虚拟机或实体机) 目的:在Windows系统上通过VNC远程访问Ubuntu. ...

  7. [原创]JAVA解决喝汽水问题

    问题:一瓶汽水单价2.5元,四个瓶盖或者两个瓶子可以换取一瓶汽水.给定金额得出一共能喝几瓶汽水? 实现: #cat drink.java import java.io.BufferedReader; ...

  8. windows RDP远程代码执行_CVE-2019-0708漏洞复现

    windows RDP远程代码执行_CVE-2019-0708漏洞复现 一.漏洞概述 2019年5月14日微软官方发布安全补丁,修复了windows远程桌面服务的远程代码执行漏洞,该漏洞影响了某些旧版 ...

  9. 个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇

    Excel作为众多数据存储的交换介质,在不同的系统内的数据很少可以很连贯地进行整合分析,一般的业务系统都会提供导出Excel作为标配功能供用户使用系统内生成的数据. 此时最大的问题是,Excel很维去 ...

  10. 踩坑 Spring Cloud Hystrix 线程池队列配置

    背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔 ...