思路:

f[i][a][b][c][d]

表示在第i天 昨天1矿吃的是a 前天1矿吃的是b

昨天2矿吃的是c 前天2矿吃的是d

的最优解

暴力转移

哦 需要优化一下空间… 变成i%2 就好了

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=100050;
int n,f[2][4][4][4][4],ans;
char ch[N];
int cmp(int a,int b,int c){
bool vis[4];
memset(vis,0,sizeof(vis));
vis[a]=vis[b]=vis[c]=1;
return vis[1]+vis[2]+vis[3];
}
int main(){
scanf("%d%s",&n,ch);
for(int i=0;i<n;i++)
if(ch[i]=='M')ch[i]=1;
else if(ch[i]=='F')ch[i]=2;
else ch[i]=3;
memset(f,-1,sizeof(f));
f[0][0][0][0][0]=0;
for(int i=0;i<n;i++)for(int a=0;a<=3;a++)
for(int b=0;b<=3;b++)for(int c=0;c<=3;c++)
for(int d=0;d<=3;d++)if(~f[i&1][a][b][c][d]){
int add1=cmp(a,b,ch[i]),add2=cmp(c,d,ch[i]);
f[!(i&1)][ch[i]][a][c][d]=max(f[!(i&1)][ch[i]][a][c][d],f[i&1][a][b][c][d]+add1);
f[!(i&1)][a][b][ch[i]][c]=max(f[!(i&1)][a][b][ch[i]][c],f[i&1][a][b][c][d]+add2);
if(i==n-1)ans=max(ans,max(f[!(i&1)][ch[i]][a][c][d],f[!(i&1)][a][b][ch[i]][c]));
}
printf("%d\n",ans);
}

BZOJ 1806 DP的更多相关文章

  1. [BZOJ 1806] Miners 矿工配餐

    Link: BZOJ 1806 传送门 Solution: 为了使状态包含每个节点前所有必须的信息: 设$dp[i][a1][a2][b1][b2]$为配送到第$i$个,一厂前两个为$a1,a2$,二 ...

  2. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

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

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

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

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

  5. BZOJ 1806 矿工配餐(DP)

    很水的DP. 因为每一个餐车的加入只需要知道当前矿洞的前两个餐车种类就行了.而餐车一共就三种. 所以令dp[i][Sa][Sb]表示前i辆餐车送餐完毕后第一个矿洞的前两个餐车种类为Sa,第二个矿洞的前 ...

  6. BZOJ - 1003 DP+最短路

    这道题被马老板毒瘤了一下,TLE到怀疑人生 //然而BZOJ上妥妥地过了(5500ms+ -> 400ms+) 要么SPFA太玄学要么是初始化block被卡到O(n^4) 不管了,不改了 另外D ...

  7. BZOJ 2431 & DP

    题意:求逆序对数量为k的长度为n的排列的个数 SOL: 显然我们可以对最后一位数字进行讨论,判断其已经产生多少逆序对数量,然后对于前n-1位同样考虑---->每一个长度的排列我们都可以看做是相同 ...

  8. bzoj 1791 DP

    首先对于一棵树我们可以tree_dp来解决这个问题,那么对于环上每个点为根的树我们可以求出这个树的一端为根的最长链,并且在tree_dp的过程中更新答案.那么我们对于环,从某个点断开,破环为链,然后再 ...

  9. bzoj 1592 dp

    就是dp啊 f[i][j]表示到第i位,最后一位高度是j的最小花费 转移::f[i][j]=minn(f[i-1][k])+abs(a[i]-num[j]);(k<=j) #include< ...

随机推荐

  1. 学习js与css 写个2048

    学习阶段,还是写点小东西练练手学的有意思一点,今天用栅格布局做了一个2048,但是移动动画和合并特效没有做,只简单的实现了一下功能. 记录一下学习的过程. 1.入口函数,初始化界面,我这里是直接是一个 ...

  2. dataAdapter

    public static class DataAdapter { /// <summary> /// DataRow转换成Hash对象 /// </summary> /// ...

  3. 关于编译PCL1.71

    最近在编译PCL1.71时总会出现错误, 编译的时候就出现无法生成pcl_io_debug.lib 由于无法生成pcl_io_debug.lib,. 借鉴PCL中国的经验: (1):把io\inclu ...

  4. Socket 数据包顺序的问题

    今天遇到一个问题,到现在还未查明原因,记录一下,留后续跟踪. 基于Netty的Socket通讯问题,Server在向Client发送数据时,假设数据原顺序为1,2,3,4...  但到了客户端顺序可能 ...

  5. 优动漫PAINT用户界面介绍

    使用优动漫PAINT能够快速实现工程巨大的漫画.插画以及动画,从13年发布至今一直备受好评,目前优动漫PAINT1.6.6.1是最新的版本,新版本的完善也受到更多年轻伙伴的青睐,使用优动漫PAINT可 ...

  6. TF基础5

    卷积神经网络CNN 卷积神经网络的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量. 神经网络的基本组成包括输入层.隐藏层和输出层. 卷积神经网络的特点在于隐藏层分为卷积层和池化层. pad ...

  7. Python中的多个装饰器装饰一个函数

    def wrapper1(func1): def inner1(): print('w1 ,before') func1() print('w1 after') return inner1 def w ...

  8. JS for循环的应用: 打印三角形

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. WEBGL学习【六】动起来的三棱锥和立方体

    <html lang="zh-CN"> <!--服务器运行地址:http://127.0.0.1:8080/webgl/LearnNeHeWebGL/NeHeWe ...

  10. LCIS 最长公共上升子序列问题DP算法及优化

    一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例 ...