楼下是传送门:
http://www.lydsy.com/JudgeOnline/problem.php?id=1806

Description

现有两个煤矿,每个煤矿都雇用一组矿工。采煤工作很辛苦,所以矿工们需要良好饮食。每当一辆食品车到达煤矿时,矿工们便会产出一定数量的煤。有三种类型的食品车:肉车,鱼车和面包车。 矿工们喜欢变化的食谱。如果提供的食品能够不断变化,他们的产煤量将会增加。每当一个新的食品车到达煤矿时,矿工们就会比较这种新的食品和前两次(或者少于两次,如果前面运送食品的次数不足两次)的食品,并且: • 如果这几次食品车都是同一类型的食品,则矿工们产出一个单位的煤。 • 如果这几次食品车中有两种不同类型的食品,则矿工们产出两个单位的煤。 • 如果这几次食品车中有三种不同类型的食品,则矿工们产出三个单位的煤。 预先已知食品车的类型及其被配送的顺序。通过确定哪车食品送到哪个煤矿可以影响产煤量。食品车不能被拆分,每个食品车必须被全部送到一个或另一个煤矿。两个煤矿也并不要求接收相同数量的食品车(事实上,也允许将所有食品车都送到一个煤矿)。 任务 给出食品车的类型及其被配送的顺序,要求你写一个程序,确定哪个食品车应被送到煤矿1,哪个食品车应被送到煤矿2,以使得两个煤矿的产煤量的总和最大。

Input

输入的第一行包含一个整数N (1 ≤ N ≤ 100 000), 表示食品车的数目。 第二行包含一个由N个字符组成的字符串,按照配送顺序依次表示食品车配送的食品的类型。每个字符是以下三个大写字母之一:’M’ (表示肉类), ‘F’ (表示鱼类) 或 ‘B’ (表示面包)。

Output

输出一个整数,表示最大的总产煤量。 评分 在45分的测试数据中,食品车的数目至多为20

Sample Input

6
MBMFFB

Sample Output

12

思路

五维DP只要不是很丧病,一般就是第一维枚举位置状态,第二三维表示第一个情况的选择状态,第四五维表示第二个情况的选择状态,最终用总的状态求解
多用于求相同的两者的符合题意状态之和的最大或最小值
在本题中第一位枚举的是第几辆车,二三维是第一个矿洞,四五维是第二个矿洞,分表表示了数量和状态
开始的时候预处理一下每个种类以避免重复等等,接着用一个check函数,判断是否满足题目中给定的条件
最后进行dp比较取更大的作为答案
能水过Codevs的数据的TLE…..
http://codevs.cn/problem/1801/
代码如下:

//TLE
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
#define ri register int
const int sz = 1000010;
inline void read(int &x){x=0;bool fl=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fl=1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}if(fl) x*=-1;
}
inline int check(int a,int b,int c)
{if(a==0&&b==0) return 1;if(a==0) return 1+(b!=c);//代表如果b!=c返回1 if(a==b&&b==c) return 1;if(a==b||b==c||a==c) return 2;return 3;
}
int t[sz],n,f[sz][4][4][4][4];
char s[sz];
int dp(int pos,int a,int b,int x,int y)
{if(pos==n+1) return 0;if(f[pos][a][b][x][y]!=-1)return f[pos][a][b][x][y];return f[pos][a][b][x][y]=max(dp(pos+1,b,t[pos],x,y)+check(a,b,t[pos]),dp(pos+1,a,b,y,t[pos])+check(x,y,t[pos]));
}
int main()
{read(n);scanf("%s",s);for(ri i=0;i<n;++i)//!从0开始读 if( s[i] == 'B' ) t[i+1] = 1;else if( s[i] == 'M' ) t[i+1] = 2;else t[i + 1] = 3;memset(f,-1,sizeof(f));cout<<dp(1,0,0,0,0);return 0;
}

但是上面的只能水过10000的数据,对于加强的100000数据无可奈何,惨遭三遍TLE,各种优化卡常献祭秒数却还是难以逃脱这一点
最后各种泪奔直到看到黄学长博客里记录%%%
http://hzwer.com/3645.html
“dp加个滚动数组就差不多了”
浔阳 DP 无滚动,一句惊醒梦中人;
垂死病中惊坐起,谈笑风生又一年
这里的f[i][a1][a2][b1][b2]表示发放第i份食品后第一矿洞最近的食品为 a1 a2,b1 b2同理,读入的时候判断成为什么值,具体的check还是要具题目来自己分析分析,毕竟这个还是比较好弄的
代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline void read(int &x){x=0;bool fl=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') fl=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=fl;
}
char ch[100010];
int f[5][4][4][4][4],ans,n;
inline int getint(char c)
{if(c=='M')return 1;else if(c=='F')return 2;else return 3;
}
inline int check(int a,int b,int c)
{if(a==0&&b==0) return 1;if(a==0) return 1+(b!=c);//代表如果b!=c返回1 if(a==b&&b==c) return 1;if(a==b||b==c||a==c) return 2;return 3;
}
int main()
{memset(f,-1,sizeof(f));f[0][0][0][0][0]=0;read(n);scanf("%s",ch);for(int i=0;i<n;i++)for(int a1=0;a1<=3;a1++)for(int a2=0;a2<=3;a2++)for(int b1=0;b1<=3;b1++)for(int b2=0;b2<=3;b2++){int x=i%4,y=(i+1)%4;if(f[x][a1][a2][b1][b2]==-1)continue;int t=getint(ch[i]),add;add=check(a1,a2,t);f[y][a2][t][b1][b2]=max(f[y][a2][t][b1][b2],f[x][a1][a2][b1][b2]+add);add=check(b1,b2,t);f[y][a1][a2][b2][t]=max(f[y][a1][a2][b2][t],f[x][a1][a2][b1][b2]+add);}for(int a1=0;a1<=3;a1++)for(int a2=0;a2<=3;a2++)for(int b1=0;b1<=3;b1++)for(int b2=0;b2<=3;b2++)ans=max(ans,f[n%4][a1][a2][b1][b2]);//滚啊滚找回失去的时间【雾】printf("%d",ans);return 0;
}

【bzoj 1806/CS 1801】矿工配餐 IOI2007(五维DP+滚动数组)相关推荐

  1. BZOJ 3132 上帝造题的七分钟(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...

  2. 【BZOJ 1062】 1062: [NOI2008]糖果雨 (二维树状数组)**

    1062: [NOI2008]糖果雨 Description 有一个美丽的童话:在天空的尽头有一个" 糖果国" ,这里大到摩天大厦,小到小花小草都是用糖果建造而成 的.更加神奇的是 ...

  3. WinFormreportViewer(rdlc)报表[列表]的使用(一)(附源码示例) 之配餐系统的开发

    紧接着"WinForm"reportViewer报表[矩阵]的使用(一)(附源码示例)" 之配餐系统的开发"这篇文章,此文与大家分享的是在 配餐系统的开发 中使 ...

  4. WinForm立体饼状图实现(附源码示例) 之配餐系统的开发

    本文所要将的是在"配餐系统"开发中 立体饼状图效果的实现,直接贴出代码和附上示例,相信需要的朋友可以很容易使用!项目中的效果图,如下: 实现 应用的是 System.Drawing ...

  5. WinFormreportViewer报表[矩阵]的使用(一)(附源码示例) 之配餐系统的开发

    winform开发中,报表在大多管理软件和数据分析中是必备的一个功能,追求简单.快捷.美观的报表开发是大家在做此类应用时比较关心的问题.就winform中的报表控件:大家熟知.不错的有reportVi ...

  6. CCF201409-4 最优配餐(100分)

    试题编号: 201409-4 试题名称: 最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客 ...

  7. 【附源码】Java计算机毕业设计安卓高速铁路配餐app论文(程序+LW+部署)

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  8. 营养学和计算机交叉,营养配餐系统综述

    2.3.1营养膳食配菜系统的特色 这套系统的特色之一在于它的疾病优选功能模块.冯剑,曹琳经过大量的研究工作建立了三种定量关系: (1)疾病同营养元素的关系,疾病对每种营养素都有各自的要求,一种营养素对 ...

  9. 免费版家庭营养配餐软件介绍

    飞华营养软件开发团队于2016年11月28日推出免费版"家庭营养配餐v2.1"软件.目的是普及营养知识,纠正不良的膳食结构,树立科学的饮食观念,指导人们合理的调配三餐食谱,增进健康 ...

最新文章

  1. svn服务器发生变更,如何切换
  2. ROS教程(3)---静态NAT配置及应用 (
  3. 解决GIT代码仓库不同步问题
  4. CentOS中安装git
  5. matlab充分利用性能,Matlab高性能编程——代码优化和并行计算
  6. 独家!支付宝小程序技术架构全解析
  7. matlab中gatbx工具箱的添加
  8. dede后台栏目管理文章统计数量和实际文章数不一致解决办法
  9. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
  10. modbus从站模拟软件_作为工控电气人,你知道我们必备的软件有哪些吗?
  11. STM32f103——ILI9341
  12. c语言判断任意位数能否倒序数,C语言求助!一个三位数的逆序数,总是编不对...
  13. 闪电网络开启BTC支付时代?他们不同意
  14. 基于JSP小型超市管理系统
  15. WiFi共享大师 去广告
  16. gpu cpu交互_CPU和GPU如何交互以渲染计算机图形?
  17. python安装库的命令-免费足球现场直播直播
  18. Rails图像上传:使用CarrierWave和Devise
  19. clamped b_spline
  20. 车路协同信息交互技术要求第 1 部分:路侧设施与云控平台

热门文章

  1. 英文论文(sci)解读复现【NO.12】YOLO-Tea: YOLOv5改进的茶叶病害检测模型
  2. c语言scanf占位符多报错,c语言标准输入和scanf的关系
  3. 【Vmware】虚拟机 | 网络配置 | ip配置
  4. 北京网商服务平台评出首批重点企业 扶持力度大增
  5. 细品RibbonX(31):buttonGroup元素详解
  6. bWAPP靶场之OS Command Injection(+Blind)
  7. MySQL delete删除数据后,释放磁盘空间
  8. ALOKEX交易所——数字经济崛起 领航完美未来
  9. retina屏幕,适配
  10. 前端开发之——网页如何适配Retina屏幕