标签:并且 zoj desc 经典 == end arc bsp 格式
描述 Description | |||
某天,小x在玩一个经典小游戏——zumo。 zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大于等于k个,这些珠子就会消失。当然,最初的状态可能不必要直接消掉一些珠子(见样例)。现在你有无穷个所有颜色的珠子,并且你可以在任意地方插入珠子。 现在提出问题:给你一个固定的状态,你最少需要用多少个小球,才能将所有的小球消去。 |
|||
输入格式 Input Format | |||
第一行是两个整数,n (1 ≤ n ≤ 100)和k(2 ≤ k ≤5),表示有n个彩色珠子,必须连续有k个以上(包括k个)相同颜色的珠子,这些珠子才会消失。 接下来一行包含n个用空格隔开的整数,每个数在1到100之间,每个数值表示一个珠子的颜色,相同的数字意味着珠子的颜色相同。 |
|||
输出格式 Output Format | |||
一个整数,表示最少需要用多少个小球,才能让所有的小球消失。 |
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 }
[BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划
标签:并且 zoj desc 经典 == end arc bsp 格式
原文地址:http://www.cnblogs.com/137shoebills/p/7783643.html