思路:

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. 洛谷P2455 [SDOI2006]线性方程组(高斯消元)

    题目描述 已知n元线性一次方程组. 其中:n<=50, 系数是[b][color=red]整数<=100(有负数),bi的值都是整数且<300(有负数)(特别感谢U14968 mmq ...

  2. jQueryDOM操作模块

    DOM操作模块 1.复习选择器模块(选择器模块结束) 目的:学而时习之 复习和总结选择器模块 2.DOM的基本操作方法 目标:回顾DOM操作的基本方法 3.1 DOM操作 -创建节点 练习 1:创建1 ...

  3. C# 5.0新加特性

    1. 异步编程 在.Net 4.5中,通过async和await两个关键字,引入了一种新的基于任务的异步编程模型(TAP).在这种方式下,可以通过类似同步方式编写异步代码,极大简化了异步编程模型.如下 ...

  4. css—各浏览器下的背景色渐变

    .linear{ width:100%; height:600px; FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0 ...

  5. (转)shiro权限框架详解03-shiro介绍

    http://blog.csdn.net/facekbook/article/details/54893740 shiro介绍 本文正式进入主题.本文将介绍如下内容: 什么是shiro 为什么需要学习 ...

  6. js 读取外部的本地json文件

    Javascript 读取外部的本地json文件 方案1 运行本地web服务器,提供文件服务 方案2 1.data = '[{"name" : "Ashwin" ...

  7. SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用

    SciSharp Cube 在Docker容器中快速体验SciSharp机器学习工具的最新功能. 项目地址:https://github.com/SciSharp/SciSharpCube 从Dock ...

  8. JDBC连接MySQL数据库(一)——数据库的基本连接

    JDBC的概念在使用之前我们先了解一下JDBC的概念, JDBC的全称是数据库连接(Java Database Connectivity),它是一套用于执行SQL语句时的API,应用程序可以通过这套A ...

  9. loadrunner笔记----好记性不如烂笔头

    1.Loadrunner主要由Vugen,Controller和Analyais3部分组成 2.简述描述集合点和集合点函数 集合点可以同步虚拟用户,以便能在同一时刻执行任务,集合点函数lr_rende ...

  10. jmeter图片的下载

    1.jmeter下载文件 首先添加一个线程组,然后在线程组里面添加一个http请求,因为是获取数据,所有是get请求,写好下载的地址 1.添加线程组 :右键测试计划,添加-Threads(Users) ...