描述 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. html5手机Web单页应用实践--起点移动阅读

    一开始以hybrid形式做了一个android的小说阅读客户端,叫4G阅读.而后由于业务需求,要迅速实现纯手机html5 版的,所以就直接在原先客户端内内嵌的网页进行改版,快速实现以后在优化的过程中发 ...

  2. 美团实习Java岗面经,已拿offer

    作者:icysnowgx 链接:https://www.nowcoder.com/discuss/71954?type=2&order=3&pos=10&page=1 来源:牛 ...

  3. CentOS 6.6下目录结构及其主要作用

    今天我们总结一下CentOS 6.6的linux的目录结构,一个系统的目录众多,这里我们主要认识一下,根目录下的主要目录,首先我们可以通过tree命令查看一次根目录下一层目录都有什么目录, 补充:不能 ...

  4. 大数据系列之Flume+kafka 整合

    相关文章: 大数据系列之Kafka安装 大数据系列之Flume--几种不同的Sources 大数据系列之Flume+HDFS 关于Flume 的 一些核心概念: 组件名称     功能介绍 Agent ...

  5. SPOJ DQUERY D-query (在线主席树/ 离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...

  6. 字典对象的 Pythonic 用法(上篇)

    字典对象在Python中作为最常用的数据结构之一,和数字.字符串.列表.元组并列为5大基本数据结构,字典中的元素通过键来存取,而非像列表一样通过偏移存取.笔者总结了字典的一些常用Pyhonic用法,这 ...

  7. day41 - 异步IO、协程

    目录 (见右侧目录栏导航) - 1. 前言- 2. IO的五种模型- 3. 协程    - 3.1 协程的概念- 4. Gevent 模块    - 4.1 gevent 基本使用    - 4.2 ...

  8. scrollreveal(页面滚动显示动画插件支持手机)

    scrollreveal.js是一款可以轻易实现桌面和移动浏览器元素随页面滚动产生动画的js插件.该插件通过配置可以在页面滚动,元素进入视口时产生炫酷的动画效果,同时还支持元素的3D效果,非常的实用. ...

  9. java基础8 构造函数和构造代码块

    一.构造函数 1 构造函数的作用 给对应的对象进行初始化. 2 构造函数的格式 修饰符 函数名(形式参数){ //函数名就是类名 函数体 } 举例说明: class Perosn{ private i ...

  10. python_线程、进程和协程

    线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python #coding=utf-8 __author__ = 'yinjia' i ...