luogu 4401 矿工配餐 多维dp
五维dp,记忆化搜索会MLE超内存,所以用滚动数组,十分经典
五维dp
#include <bits/stdc++.h> using namespace std;
const int maxn=;
int n,tp[maxn],now[][][][],last[][][][];
char s[maxn];
int trans(char c){
if(c=='M')return ;
if(c=='F')return ;
if(c=='B')return ;
return -;
}
int judge(int a,int b,int c){
if(!a && !b) return ;
if(!a )return (b!=c)+;
if(a==b && b==c)return ;
return (a!=b)+(b!=c)+(c!=a);
}
int main(){
//freopen("77.in","r",stdin);
//freopen("77.out","w",stdout);
scanf("%d",&n);
scanf("%s",s);
for(int i=;i<=n;i++)
tp[i]=trans(s[i-]);
for(int i=n;i>=;i--){
memset(now,,sizeof now);
int p1,p2;
for(int a1=;a1<=;a1++)
for(int a2=;a2<=;a2++)
for(int b1=;b1<=;b1++)
for(int b2=;b2<=;b2++){
p1=judge(a1,a2,tp[i]),p2=judge(b1,b2,tp[i]);
now[a1][a2][b1][b2]=max(last[a2][tp[i]][b1][b2]+p1,last[a1][a2][b2][tp[i]]+p2);
}swap(now,last);
}
printf("%d",last[][][][]);
return ;
}
记忆化搜索
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=;
int n,tp[maxn],f[maxn][][][][]; int trans(char c){
if(c=='M')return ;
if(c=='F')return ;
if(c=='B')return ;
return -;
}
int judge(int a,int b,int c){
if(!a && !b) return ;
if(!a )return (b!=c)+;
if(a==b && b==c)return ;
return (a!=b)+(b!=c)+(c!=a);
}
int dp(int now,int a1,int a2,int b1,int b2){
if(now>n) return ;
if(f[now][a1][a2][b1][b2]) return f[now][a1][a2][b1][b2];
f[now][a1][a2][b1][b2]=max( dp(now+,a2,tp[now],b1,b2)+judge(a1,a2,tp[now]),dp(now+,a1,a2,b2,tp[now])+judge(b1,b2,tp[now]) );
return f[now][a1][a2][b1][b2];
}
char s[maxn];
int main(){
freopen("77.in","r",stdin);
freopen("77.out","w",stdout);
scanf("%d",&n);
scanf("%s",s);
for(int i=;i<=n;i++){
int t=trans(s[i-]);
tp[i]=t;
}printf("%d\n",dp(,,,,));
return ;
}
用于复习了
luogu 4401 矿工配餐 多维dp的更多相关文章
- BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )
dp... ------------------------------------------------------------------------------- #include<cs ...
- [Ioi2007]Miners 矿工配餐(BZOJ1806)
[Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 214 Solved: 128 Description 现有两 ...
- bzoj1806 [Ioi2007]Miners矿工配餐
[bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...
- [IOI2007]Miners 矿工配餐
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...
- BZOJ 1806 矿工配餐(DP)
很水的DP. 因为每一个餐车的加入只需要知道当前矿洞的前两个餐车种类就行了.而餐车一共就三种. 所以令dp[i][Sa][Sb]表示前i辆餐车送餐完毕后第一个矿洞的前两个餐车种类为Sa,第二个矿洞的前 ...
- 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp
题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...
- bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...
- Vijos1386 IOI2007 矿工配餐 动态规划
感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...
- [bzoj1806] [ioi2007]Miners 矿工配餐
相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...
随机推荐
- PP学习笔记-业务基础
生产主数据.生产计划.生产订单与生产执行 生产模块主要子模块及功能:PP-BD 基本数据管理 PP-SFC车间订单管理 PP-MRP物料需求计划 PP-MPS主生产计划 PP-CRP能力计划 PP-I ...
- Beyond Compare 4过期
试用期到期操作:找到beyond Compare 4文件夹下面的BCUnrar.dll,将其删掉或者重命名,再重新打开接着使用!
- Bash Game 巴什博弈
巴什博弈(Bash Game,同余理论):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- Leetcode 70.爬楼梯 By Python
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...
- android progressdialog 对话框试用实例
ProgressDialog 跟AlertDialog用法差不多,不同的是:ProgressDialog 显示的是一种"加载中"的效果,android 中 ProgressDial ...
- 【BZOJ4161】Shlw loves matrixI (常系数齐次线性递推)
[BZOJ4161]Shlw loves matrixI (常系数齐次线性递推) 题面 BZOJ 题解 \(k\)很小,可以直接暴力多项式乘法和取模. 然后就是常系数齐次线性递推那套理论了,戳这里 # ...
- 洛谷 P2672 推销员 解题报告
P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...
- 洛谷 P2515 [HAOI2010]软件安装 解题报告
P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...
- activity中访问内部fragment的函数
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCod ...