描述 Description  
  某天,小x在玩一个经典小游戏——zumo。
zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大于等于k个,这些珠子就会消失。当然,最初的状态可能不必要直接消掉一些珠子(见样例)。现在你有无穷个所有颜色的珠子,并且你可以在任意地方插入珠子。
现在提出问题:给你一个固定的状态,你最少需要用多少个小球,才能将所有的小球消去。

     
     
  输入格式 Input Format  
  第一行是两个整数,n (1 ≤ n ≤ 100)和k(2 ≤ k ≤5),表示有n个彩色珠子,必须连续有k个以上(包括k个)相同颜色的珠子,这些珠子才会消失。
接下来一行包含n个用空格隔开的整数,每个数在1到100之间,每个数值表示一个珠子的颜色,相同的数字意味着珠子的颜色相同。
     
     
  输出格式 Output Format  
  一个整数,表示最少需要用多少个小球,才能让所有的小球消失。
http://www.cnblogs.com/AndreMouche/archive/2011/02/27/1966504.html
↑大神的程序...
 
状态可以通过记忆化搜索找(复习时间:记忆化搜索就是把找到的东西都存在f[i][j][cnt]里下次用这个值就不用搜了... )
f[i][j][cnt] =x 表示从i到j的珠子前有cnt个连续的紧跟在i前面的与第i个珠子相同的珠子,此时需要x个珠子可以让他们全部消失(BOOM!)
搜索时也是这三个变量(虽然记录的是cnt,但是cnt+1才是此时记录的连续的珠子的个数(加上i位置的珠子))
 
 
 
 
下面是手把手的贴心的和贴代码没两样的题解...聪明人就不要往下看了...(我找不到要点所以就把代码含义叙述了一遍)
 
当f[i][j][cnt] 储存有有意义的值(搜索过了)的时候,直接返回该值;
i=j时 返回k(k个珠子时可以可以消失)-(1+cnt)(把最后剩下来的珠子补成k个)
i>j时,当然不需要珠子啦...返回0
 
连续的珠子数(cnt+1)大于等于k时,则消去这些珠子,搜索从i+1到j个珠子(因为前面多于k的珠子自动消去所以此时f[i+1][j][0]和f[i][j][cnt]等效.....)
小于时,则搜索手动加进去一个珠子的状态,即f[i][j][cnt+1]+1和f[i][j][cnt]等效...
 
此时该搜的都搜了,,就需要dp来找状态的最优值...,在i和j之间找一个w,w位置的小球和i位置的一样......则
f[i][j][cnt] =min(f[i][j][cnt],f[i+1][w-1][0]+f[w][j][min(cnt+1,k-1)]);
这个应该很好理解所以我就不手把手解释了....就是消去中间的珠子然后让两边一样的珠子撞在一起再消一次,正常的祖玛方法......
 
最后把f[i][j][cnt]的值返回
 
有些地方我没写dfs(i,j,cnt)什么的但是不代表不用递归.....某个f[i][j][cnt]如果没值当然要搜索它啊...仙女教母不会自动给你初始化成正确答案的,这是搜索,醒醒!!!!而且搜索之后别忘了记忆化...所以这个鬼畜的东西才叫记忆化搜索...
 
欢迎神犇捉虫...虽然神犇看这么简单的题估计题解都不愿意写...
因为校对无能所以真的有什么错误我不负责任...
 
代码
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int n,k;
int a[][]={};
int dd[]={};
int f[][][];
int fff(int b1,int b,int cnt){
int &cur=f[b1][b][cnt];
if(cur!=-) return cur;
if(b1==b){
cur=k-cnt-;
return cur;
}
if(b1>b){
cur=;
return cur;
}
if(cnt<k-){
cur=fff(b1,b,cnt+)+;
}
else{
if(cnt>=k-){
cur=fff(b1+,b,);
}
}
int i;
for(int i=b1+;i<=b;i++){
if(dd[i]!=dd[b1]) continue;
int value=fff(b1+,i-,)+fff(i,b,min(cnt+,k-));
if(value<cur) cur=value;
}
return cur;
}
int main(){
cin>>n>>k;
int tail=-;
int sumn=;
for(int i=;i<=n;i++){
cin>>dd[i];
}
memset(f,-,sizeof(f));
cout<<fff(,n,)<<endl;
return ;
}

[BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划的更多相关文章

  1. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来 ...

  2. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  3. Codevs_1017_乘积最大_(划分型动态规划/记忆化搜索)

    描述 http://codevs.cn/problem/1017/ 给出一个n位数,在数字中间添加k个乘号,使得最终的乘积最大. 1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提 ...

  4. 动态规划——I 记忆化搜索

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  5. 动态规划——数字三角形(递归or递推or记忆化搜索)

    动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...

  6. Vijos 1011 清帝之惑之顺治 记忆录式的动态规划(记忆化搜索)

    背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...

  7. 专题1:记忆化搜索/DAG问题/基础动态规划

      A OpenJ_Bailian 1088 滑雪     B OpenJ_Bailian 1579 Function Run Fun     C HDU 1078 FatMouse and Chee ...

  8. 【BZOJ1048】分割矩阵(记忆化搜索,动态规划)

    [BZOJ1048]分割矩阵(记忆化搜索,动态规划) 题面 BZOJ 洛谷 题解 一个很简单的\(dp\),写成记忆化搜索的形式的挺不错的. #include<iostream> #inc ...

  9. sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

    Description In the two-player game "Two Ends", an even number of cards is laid out in a ro ...

随机推荐

  1. final关键字详解

    java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承 ...

  2. 爬虫--Scrapy之Downloader Middleware

    下载器中间件(Downloader Middleware) 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和respons ...

  3. JS日历控件特效代码layDate

    https://www.js-css.cn/a/jscode/date/2015/0405/1461.html

  4. 技巧之如何快速使用websocket来监控标准输出

    为啥是Websocket 服务端可以主动推送消息到浏览器端.比如服务端实时在打印日志,这是一个标准输出,可以实时将日志推送到浏览器. 为啥用websocketd (https://github.com ...

  5. C语言回调函数总结

    /* Main program ---calls--> Library function ---calls--> Callback funtion */ #include <stdi ...

  6. i8042 键盘控制器-------详细介绍

    [转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...

  7. 【转载】如何解决failed to push some refs to git

    在使用git 对源代码进行push到gitHub时可能会出错,信息如下   此时很多人会尝试下面的命令把当前分支代码上传到master分支上. $ git push -u origin master ...

  8. day01作业

    Java技术按照用途不同分为三大版本,分别是JavaSE.JavaEE和JavaMeJava虚拟机就是一个虚拟的用于执行字节码文件的计算机.它是Java最核心的技术,是Java跨平台的基础.DOS命令 ...

  9. kali&BT安装好之后无法上网(包括Wifi)或者无法获得内网IP解决方法

    大家都知道,要想进行内网渗透攻击,你必须要在那个内网里.但是大家在Vmware里安装kali的时候,大多数用户为了方便,未选择桥接模式,而是选择了使用与本机共享的IP网络当然,这样能上网,但是你的虚拟 ...

  10. Bootstrap – 1.认识

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...