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题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...
随机推荐
- Golang的位运算操作符的使用
& 位运算 AND | 位运算 OR ^ 位运算 XOR &^ 位清空 (AND NOT) << 左移 >> 右移 感觉位运算操作符虽然在平时用得并不多,但是在 ...
- Java微信二次开发(九)
多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...
- Lodop导出excel及提示成功【回调和直接返回值】
高版本的火狐和谷歌不再支持np插件之后,Lodop公司推出了C-Lodop,解决了这些浏览器不能用Lodop插件方式打印的问题,相比较Lodop插件,C-Lodop由于是以服务的形式出现,返回值不能直 ...
- Codeforces Round #436 (Div. 2) A,B,D
A. Fair Game 题目链接:http://codeforces.com/contest/864/problem/A 水题 #include<iostream> #include&l ...
- 自学Zabbix3.12.6-动作Action-Escalations配置
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 3.12.6 自学Zabbix3.12.6-动作Action-Escalations配置 1. 概 ...
- selenium 登陆小技巧
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Fi ...
- Asp:函数是用传值还是传址
传址会把变量的内存地址传递到sub里,在sub里对变量所做的修改就是对原来的变量进行修改,而传值只是把变量的值传递到sub里,此时在sub里修改变量的值不会影响原来的变量. 在vb中调用函数默认是传址 ...
- word宏(macro) 之 注意事项,常见语法和学习地方
宏:计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种 ...
- jQuery中json中关于带有html代码网页的处理
昨天在使用jQuery的get方式请求返回json格式数据.然后使用jQuery自带的parseJSON 处理.总是出现这样的错误. 如果返回数据中content改成普通的数据可以通过.找了半天错误, ...
- request请求地址
1.String contextPath = httpServletRequest.getServletContext().getContextPath(); /项目名称 2.String conte ...