[BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划

2024-02-15 06:10

本文主要是介绍[BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 
 描述 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]如果没值当然要搜索它啊...仙女教母不会自动给你初始化成正确答案的,这是搜索,醒醒!!!!而且搜索之后别忘了记忆化...所以这个鬼畜的东西才叫记忆化搜索...
 
欢迎神犇捉虫...虽然神犇看这么简单的题估计题解都不愿意写...
因为校对无能所以真的有什么错误我不负责任...
代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 int n,k;
 9 int a[110][2]={};
10 int dd[110]={};
11 int f[110][110][110];
12 int fff(int b1,int b,int cnt){
13     int &cur=f[b1][b][cnt];
14     if(cur!=-1) return cur;
15     if(b1==b){
16         cur=k-cnt-1;
17         return cur;
18     }
19     if(b1>b){
20         cur=0;
21         return cur;
22     }
23     if(cnt<k-1){
24         cur=fff(b1,b,cnt+1)+1;
25     }
26     else{
27         if(cnt>=k-1){
28             cur=fff(b1+1,b,0);
29         }
30     }
31     int i;
32     for(int i=b1+1;i<=b;i++){
33         if(dd[i]!=dd[b1]) continue;
34         int value=fff(b1+1,i-1,0)+fff(i,b,min(cnt+1,k-1));
35         if(value<cur) cur=value;
36     }
37     return cur;
38 }
39 int main(){
40     cin>>n>>k;
41     int tail=-1;
42     int sumn=0;
43     for(int i=1;i<=n;i++){
44         cin>>dd[i];
45     }
46     memset(f,-1,sizeof(f));
47     cout<<fff(1,n,0)<<endl;
48     return 0;
49 }
View Code

 

转载于:https://www.cnblogs.com/137shoebills/p/7783643.html

这篇关于[BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/710615

相关文章

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作