【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=1806

【题意】

给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列,使获益最大。

【思路】

设f[i][a][b][c][d]表示前i个数,分给A的倒数两个为ab,分给B的倒数两个为cd,则有转移式:

f[i+1][b][x][c][d]<- f[i][a][b][c][d]+w(a,b,x)

f[i+1][a][b][d][x]<- f[i][a][b][c][d]+w(c,d,x)

其中x=s[i],w为权值计算函数。

【代码】

 #include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std; const int N = 1e5+; char s[N];
int n,f[][][][][]; int calc(int a,int b,int x)
{
int s=;
if(a) s++; if(b) s++;
if(a==b&&a) s--;
if(x==a) s--;
if(x==b&&a!=b) s--;
return s;
} int main()
{
scanf("%d%s",&n,s+);
int cur=;
memset(f[cur],0xef,sizeof(f[cur]));
f[cur][][][][]=;
FOR(i,,n) {
cur^=;
int x;
if(s[i]=='M') x=; else if(s[i]=='F') x=; else x=;
memset(f[cur],0xef,sizeof(f[cur]));
FOR(a,,) FOR(b,,) FOR(c,,) FOR(d,,) {
f[cur][b][x][c][d]=max(f[cur][b][x][c][d],f[cur^][a][b][c][d]+calc(a,b,x));
f[cur][a][b][d][x]=max(f[cur][a][b][d][x],f[cur^][a][b][c][d]+calc(c,d,x));
}
}
int ans=;
FOR(a,,) FOR(b,,) FOR(c,,) FOR(d,,)
ans=max(ans,f[cur][a][b][c][d]);
printf("%d\n",ans);
return ;
}

bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)的更多相关文章

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

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

  2. BZOJ 1806: [Ioi2007]Miners 矿工配餐

    ime Limit: 10 Sec  Memory Limit: 64 MBSubmit: 910  Solved: 559[Submit][Status][Discuss] Description ...

  3. BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划

    题目大意:将一个123序列拆分为两个子序列.定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值 令f[i][a1][a2][b1][b2]为前i个数分成两组,第一 ...

  4. 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp

    题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...

  5. [Ioi2007]Miners 矿工配餐(BZOJ1806)

    [Ioi2007]Miners 矿工配餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 214  Solved: 128 Description 现有两 ...

  6. bzoj1806 [Ioi2007]Miners矿工配餐

    [bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...

  7. [bzoj1806] [ioi2007]Miners 矿工配餐

    相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...

  8. [IOI2007]Miners 矿工配餐

    link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...

  9. 洛谷 P4401 [IOI2007]Miners 矿工配餐

    题意简述 有两个矿洞,已知食物的种类(≤3)和顺序,将他们送往任一矿洞, 若一个矿洞3次食物相同,贡献1:若有2种不同食物,贡献2:若有3种不同食物,贡献3 求最大贡献 题解思路 food[i] 为当 ...

随机推荐

  1. POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)

    题意:给定n个只有大写字母组成的字符串,选取尽可能多的字符串,使得这些字符串中每个字母的个数都是偶数.n<=24 思路:直接枚举每个字符串的选或不选,复杂度是O(2^n).其实还有更简便的方法. ...

  2. dojo 总结

    对以前项目中用到的dojo框架进行一个框架式的总结,以备参考学习. 主要组成... 1 开发注意... 3 Dojo代码约定... 3 Dojo形式的脚本库... 4 Dojo Build. 4 Do ...

  3. [Golang] base64加密与解密

    首先解释以下什么是base64(来自百度百科): Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64 ...

  4. jQuery_添加与删除元素

    一.jQuery添加元素(通过 jQuery,可以很容易地添加新元素/内容.) 1.添加新的 HTML 内容,用于添加新内容的四个 jQuery 方法(都能解析HTML标签): append() - ...

  5. iOS富文本(二)初识Text Kit

    概述 Text Kit 是建立在Core Text上的文本布局系统,虽然没有Core Text那么强大的文本处理功能,但是对于大多数常见的文本布局用Text Kit能够很简单的实现,而不是用Core ...

  6. iOS中第三方框架刷新

    0.先加入主头文件 #import "MJRefresh.h" 1.添加下拉刷新 MJRefreshHeaderView *header = [MJRefreshHeaderVie ...

  7. tcp的精髓:滑动窗口

    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议 关于这部分自己不晓得怎么叙述才好,因为理解的部分更多, ...

  8. 微信 ua

    Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, l ...

  9. redis 在centos下的安装部署

    安装的redis版本是 redis-3.0.2 请严格按照以下步骤进行 可以免除以下错误 1 make[2]: cc: Command not found 异常原因:没有安装gcc 解决方案:yum ...

  10. 实现LoaderCallbacks接口动态循环加载网上图片并展示在手机屏幕上 ...

    1.布局xml文件 activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...