BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划
题目大意:将一个123序列拆分为两个子序列。定义每一个数的贡献值为以这个数结尾的长度最大为3的子串中不同数的数量,求贡献值和的最大值
令f[i][a1][a2][b1][b2]为前i个数分成两组,第一组以a1 a2结尾,第二组以b1 b2结尾的最大贡献值 转移啥的自己YY吧 记得开滚动数组
尼玛写错个參数都要调半天……
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans,f[2][4][4][4][4];
inline int Get_Char()
{
char c;
do c=getchar(); while(c!='M'&&c!='F'&&c!='B');
switch(c)
{
case 'M':return 1;
case 'F':return 2;
case 'B':return 3;
}
}
inline int Score(int x,int y)
{
if(x==0) return 1;
return x==y?1:2;
}
inline int Score(int x,int y,int z)
{
int temp=x*y*z;
switch(temp)
{
case 6:return 3;
case 1:
case 8:
case 27:return 1;
case 0:return Score(y,z);
default: return 2;
}
}
int main()
{
int i,a1,a2,b1,b2;
cin>>n;
memset(f,0xef,sizeof f);
f[0][0][0][0][0]=0;
for(i=1;i<=n;i++)
{
int temp=Get_Char();
memset(f+(i&1),0xef,sizeof(f)>>1);
for(a1=0;a1<=3;a1++)
for(a2=(a1?1:0);a2<=3;a2++)
for(b1=0;b1<=3;b1++)
for(b2=(b1? 1:0);b2<=3;b2++)
if(f[~i&1][a1][a2][b1][b2]>=0)
{
f[i&1][a2][temp][b1][b2]=max(f[i&1][a2][temp][b1][b2]
,f[~i&1][a1][a2][b1][b2]+Score(a1,a2,temp));
f[i&1][a1][a2][b2][temp]=max(f[i&1][a1][a2][b2][temp]
,f[~i&1][a1][a2][b1][b2]+Score(b1,b2,temp));
}
}
for(a1=0;a1<=3;a1++)
for(a2=(a1?1:0);a2<=3;a2++)
for(b1=0;b1<=3;b1++)
for(b2=(b1?1:0);b2<=3;b2++)
ans=max(ans,f[n&1][a1][a2][b1][b2]);
cout<<ans<<endl;
}
BZOJ 1806 IOI2007 Miners 矿工配餐 动态规划的更多相关文章
- BZOJ 1806: [Ioi2007]Miners 矿工配餐( dp )
dp... ------------------------------------------------------------------------------- #include<cs ...
- bzoj 1806 [Ioi2007]Miners 矿工配餐(DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1806 [题意] 给定一个权在1..3内的序列,在保持相对位置不变的情况下拆分成两个序列 ...
- BZOJ 1806: [Ioi2007]Miners 矿工配餐
ime Limit: 10 Sec Memory Limit: 64 MBSubmit: 910 Solved: 559[Submit][Status][Discuss] Description ...
- [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 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...
- [bzoj1806] [ioi2007]Miners 矿工配餐
相当于noip前两题难度的ioi题........ 还是挺好想的...算是状压一下?...两个二进制位可以表示三种食物或者没有,所以用四个二进制位表示某个煤矿最近两餐的情况... 先把各种情况加上各种 ...
- [IOI2007]Miners 矿工配餐
link 其实就是一个比较简单的$IOI$题.简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可. #include<iostream> #include<c ...
- 【bzoj1806】[Ioi2007]Miners 矿工配餐 dp
题目描述 有n个物品,每个都是3种之一.现要将这n个物品分成两个序列,对于每个序列中的每个物品,可以得到 它及它前面相邻的两个物品(不足则取全部)中不同种类的个数 的收益.问最大的总收益. 输入 输入 ...
- 洛谷 P4401 [IOI2007]Miners 矿工配餐
题意简述 有两个矿洞,已知食物的种类(≤3)和顺序,将他们送往任一矿洞, 若一个矿洞3次食物相同,贡献1:若有2种不同食物,贡献2:若有3种不同食物,贡献3 求最大贡献 题解思路 food[i] 为当 ...
随机推荐
- jQuery提供的小方法
jQuery提供的小方法: 1.选择器 + 事件 + 函数 = 复杂的交互 2.循环处理与选择器匹配的各个元素:each() $("#").each(function(){ ...
- DexIndexOverflowException: Cannot merge new index 66080 into a non-jumbo instruction!
问题 该问题是方法数超过了65536(DEX 64K problem),无法编译成单个dex文件. 解决方案 谷歌官方给出的解决方案 android { compileSdkVersion 21 bu ...
- 上传XML文件字符编码问题
1.上传的XML文件的空格的字符编码和倒入到数据库的空格的字符编码不是一种编码格式,导致导入到数据库的数据和XML文件的数据不一致的情况,进而使展示到界面上的数据在进行搜索时不能搜索出来.解决办法: ...
- javascript日用代码集合(一)
获取url参数 function get_url_param(name){ var reg = new RegExp("(^|&)" + name + "=([^ ...
- UI设计网站参考
1. https://dribbble.com/colors/6A969A 2. 设计师网站导航:http://hao.uisdc.com/ 3. bootstrap的UI:http://www.bo ...
- Nginx+Varnish又开始新的征程了
要自己多测试一下.总觉得机器不够用.
- 【POJ3415】 Common Substrings(后缀数组|SAM)
Common Substrings Description A substring of a string T is defined as: T(i, k)=TiTi+1...Ti+k-1, 1≤i≤ ...
- java4中创建内对象的方法
在java程序中,对象可以被显式地或者隐式地创建.四种显式的创建对象的方式: ● 用new语句创建对象 ● 运用反射手段,调用java.lang.Class 或者 java.lang. ...
- Keil C中全局变量的使用
在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件. 例如:有以下两个源文件 ...
- Delphi 版本号(D1到XE6),发现一个delphi.wikia.com网站
Borland Compiler Conditional Defines Edit Talk1 2,909PAGES ONTHIS WIKI Product Name Version Cond ...