题目:

BZOJ1939(权限题)

分析:

这题很容易看出是DP,但是状态和转移都不是很好想……

用\(dp[l][r][c]\)表示在\(l\)前面已经新加了\(c\)个和\(l\)一样的弹子时,使区间\([l,r]\)消完所需插入的弹子数量

显然,当\(c\geq k-1\)时,这\(c\)个弹子和\(l\)组成了连续的至少\(k\)个弹子,这些情况是类似的(都可以一次消完)。因此可以用\(c=k-1\)的状态代表所有\(c\geq k-1\)的状态。

对于状态\((l,r,k-1)\),\(l\)可以和前面\(k-1\)个同色弹子一起消掉,因此只需要考虑要插入多少个才能完全消掉区间\([l+1,r]\)。这就得到第一个转移:(因为\([l+1,r]\)紧贴着\(l\),\(l+1\)左侧没有新插入的弹子,所以消掉\([l+1,r]\)所需插入的弹子数就是\(dp[l+1][r][0]\))

\[dp[l][r][k-1]=dp[l+1][r][0]
\]

对于状态\((l,r,c)\),在前面插入一个\(l\)的同色弹子就变成了\((l,r,c+1)\),所以比消完\((l,r,c+1)\)状态多一步,即:

\[dp[l][r][c]=dp[l][r][c+1]+1
\]

考虑对于弹子\(l\) ,除了在它前面加\((k-1)\)个同色弹子外,还可以找一个弹子\(i(i>l,a_l=a_i)\),先消去区间\([l+1,i-1]\)(该区间可能不存在),这样\(i\)左侧就有\((c+1)\)个同色弹子,这就是状态\((i,r,c+1)\)。由此得到第三个转移:(注意特判\(l+1=i\)时状态\((l+1,i-1,0)\)不存在,以及\(c+1\geq k\)时取\(c=k-1\))

\[dp[l][r][c]=dp[l+1][i-1][0]+dp[i][r][c+1](l+1\leq i-1)
\]

\[dp[l][r][c]=dp[i][r][c+1](l+1=i)
\]

代码:

有了DP方程以后代码还是很好写的

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
namespace zyt
{
const int N = 110, K = 7;
int arr[N], dp[N][N][K];
int work()
{
int n, k;
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> arr[i];
for (int i = 0; i < n; i++)
for (int c = 0; c < k; c++)
dp[i][i][c] = k - c - 1;
for (int len = 2; len <= n; len++)
for (int l = 0; l + len - 1 < n; l++)
{
int r = l + len - 1;
for (int c = k - 1; c >= 0; c--)
{
if (c < k - 1)
dp[l][r][c] = dp[l][r][c + 1] + 1;
else
dp[l][r][c] = dp[l + 1][r][0];
if (arr[l] == arr[l + 1])
dp[l][r][c] = min(dp[l][r][c], dp[l + 1][r][min(k - 1, c + 1)]);
for (int i = l + 2; i <= r; i++)
if (arr[l] == arr[i])
dp[l][r][c] = min(dp[l][r][c], dp[l + 1][i - 1][0] + dp[i][r][min(k - 1, c + 1)]);
}
}
cout << dp[0][n - 1][0];
return 0;
}
}
int main()
{
return zyt::work();
}

【BZOJ1939】[Croatian2010] Zuma(动态规划)的更多相关文章

  1. 【动态规划】bzoj1939: [Croatian2010] Zuma

    隐约记得类似的一道JSOI祖玛……然后好像这题不能够把珠子合并成一段?或许是因为这里珠子碰在一起之后可以不消除? Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 K 个 ...

  2. Bzoj1939 [Croatian2010] Zuma

    Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 43  Solved: 31 Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 ...

  3. BZOJ 1032 JSOI2007 祖码Zuma 动态规划

    题目大意:给定一个祖玛序列,任选颜色射♂出珠子,问最少射♂出多少珠子 输入法近期越来越奇怪了0.0 首先我们把连续同样的珠子都缩在一起 令f[i][j]表示从i開始的j个珠子的最小消除次数 初值 f[ ...

  4. 「SPOJ6340」「BZOJ1939」ZUMA - ZUMA【记忆化搜索】

    题目链接 [洛谷传送门] 题解 \(f[i][j][k]\)表示在消除了\((i,j)\),在后面加上了\(k\)个珠子的总的珠子数. 考虑三种决策:(题目给出的\(k\)在下文表示成\(K\)) 决 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. Codeforces Round #336 Zuma

    D. Zuma time limit per test:  2 seconds memory limit per test:  512 megabytes input:  standard input ...

  7. poj 动态规划题目列表及总结

    此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...

  8. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

  9. POJ 动态规划题目列表

    ]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...

随机推荐

  1. Python学习:ModuleNotFoundError: No module named 'pygal.i18n' 的解决方法

    最近在学<Python编程:从入门到实践>,16.2小结中 from pygal.i18n import COUNTRIES 获取两个字母的国别码,我用的pygal的版本是2.4.0(终端 ...

  2. 洛谷 2434 [SDOI2005]区间

    [题解] 鲜活的大水题... 把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间.每次更新目前最大右区间. #include<cstdio> ...

  3. 洛谷 3833 SHOI 2012 魔法树

    [题解] 树链剖分模板题.. #include<cstdio> #include<algorithm> #include<queue> #define N 5000 ...

  4. L2-014. 列车调度(带图详解)

    L2-014. 列车调度   火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选 ...

  5. nyoj 8 一种排序(用vector,sort,不用set)

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  6. mysql 5.5与5.6 timestamp 字段 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的区别

    http://www.111cn.net/database/mysql/55392.htm 本文章来给各位同学介绍关于mysql 5.5与5.6 timestamp 字段 DEFAULT CURREN ...

  7. iOS攻城狮修炼之路

    自己总结的学习iOS的笔记,打造一个全面的知识体系,iOS攻城狮修炼之路[持续更新中] iOS学习笔记01-APP相关 iOS学习笔记02-UIScrollView iOS学习笔记03-UITable ...

  8. [fw]Best Practices for Exception Handling

    http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html http://www.onjava.com/pub/a/onjava/200 ...

  9. linux下安装并配置vim

    1.安装:sudo apt-get install vim-gtk  安装好后vim,并按“tab”键,可以看到vim的存在,则安装好2.设置更加人性化:sudo vim /etc/vim/vimrc ...

  10. redis+spring

    1. 在配置文件中添加 注解 <cache:annotation-driven cache-manager="cacheManager" key-generator=&quo ...