题意:

  有一个环形序列,n个数字表示一种颜色,要求将白板环刷成一模一样的环,限制是每次最多只能刷连续的K个位置,问最少需要刷几次?

思路:

  跟2008长春那道painter string 差不多。只是这次是个环,难度也是没有提升的,只需要变成一个2*n-1个数字的序列就可以了。

  考虑区间[L,R],如果[L]和[L+1,R]中的某一个颜色相同,才有可能减少刷的次数。那么从左到右枚举这个和[L]相同颜色的位置,[L,R]的次数就可以变成[L+1,k]+[k+1,R]了。可以想象成[L]是依靠另一个同颜色的位置来获得免刷的可能,则这个位置必定是距离它K个位置之内的。如果长度为K的某一段区间[L,L+K-1]中有多段分散的同颜色的,有没有可能是刷一次那个颜色,然后其他不同颜色的再截成一段一段的,将次数给组合起来呢?其实这种情况在枚举依靠位置k的时候已经考虑了,假设你选择依靠[L+K-1],那么[L+1,L+K-2]中还有和[L]是同颜色的,而区间[L+1,L+K-1]已经是最优,其他的同色位置能不能也依靠[L+K-1]已经不是本次要考虑的问题了,本次只考虑能否让[L]依靠其他的位置从而获得免刷。

 //#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x7f3f3f3f
#define LL long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
int n, c, K;
int dp[N][N], a[N];
int cal()
{
memset(dp,,sizeof(dp));
for(int i=; i<=*n; i++)
for(int j=i; j<=*n; j++)
dp[i][j]=INF;
for(int j=; j<*n; j++)
{
for(int i=j; i>; i--)
{
dp[i][j]=dp[i+][j]+;
for(int k=i+; k<i+K&&k<=j; k++ )
{
if(a[i]!=a[k]) continue;
dp[i][j]=min(dp[i][j], dp[i+][k]+dp[k+][j]);
}
}
}
int ans=INF;
for(int i=; i<=n; i++)
{
ans=min(ans, dp[i][i+n-]);
}
return ans;
} int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%d%d%d",&n,&c,&K))
{
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
}
cout<<cal()<<endl;
}
return ;
}

AC代码

SDUT 1309 不老的传说问题 (区间DP)的更多相关文章

  1. stdu1309(不老的传说)

    题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1309.html 不老的传说问题 Ti ...

  2. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  3. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  6. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  9. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

随机推荐

  1. CF-851B

    B. Arpa and an exam about geometry time limit per test 2 seconds memory limit per test 256 megabytes ...

  2. centos6.5 下安装 sqlplus

    1.下载下面的 rpm 文件 oracle-instantclient12.-basic--.x86_64.rpm oracle-instantclient12.-devel--.x86_64.rpm ...

  3. 20.Consent Controller Get请求逻辑实现

    在这里之前讲的这一块的信息就要登场了 需要通过构造函数把这几个注入进来 县引入这三个命名空间 把这三个注入进来,这就是显示依赖 先通过returnUrl拿到这个Request request拿到后,就 ...

  4. IE各栏的截图说明

    工具栏  包括  状态栏  命令栏   菜单栏   收藏栏 IE工具 > 工具栏  > 状态栏 有状态栏显示 无状态栏显示 菜单栏 快捷键  alt  可以快速展示  菜单栏    ,查看 ...

  5. 6. webshell文件上传分析溯源

    这道题也是借助大佬的帮助才成功,具体我们来看: 既然人家扫描发现后台目录有文件上传,我们也不能落后,顺便拿出了传说中的御剑,并进行一波扫描: 发现了几个比较有用的目录,特别是upload1.php跟u ...

  6. SQL 截取时间

    -- 获取系统时间 print getdate() -- 获取3天前的时间 print dateadd(day, -3 , getdate()) -- 获取3天后的时间 print dateadd(d ...

  7. codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】

    容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...

  8. codevs 3162 抄书问题

    3162 抄书问题 题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如 ...

  9. plsql developer 执行sql 文件

    用 Command Window,执行 @'sql file path' 注意,上面sql文件路径要加单引号

  10. PAT甲级——1107 Social Clusters (并查集)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90409731 1107 Social Clusters (30  ...