SDUT 1309 不老的传说问题 (区间DP)
题意:
有一个环形序列,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)的更多相关文章
- stdu1309(不老的传说)
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1309.html 不老的传说问题 Ti ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- 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 ...
- 区间dp总结篇
前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...
随机推荐
- Redux API之combineReducers
combineReducers(reducers) 随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分. combineReducers 辅助函 ...
- 03_通过OpenHelper获取SqliteDatabase对象
MyOpenHelper openHelper = new MyOpenHelper(this); 类似于java的File file = new File();只是声明这个东西,但是文件还并没有真正 ...
- WPF PasswordBox鼠标进入时程序异常退出的解决办法
最近在开发了一个程序中用到了PasswordBox控件,但是在程序给别人用的时候,鼠标一进入控件时程序就异常退出,查了下windows日志,错误显示如下: 应用程序: WpfPasswordTest2 ...
- html中NAME和ID区别
html中NAME和ID区别 NAME 的最大作用就是可以与服务端进行交互.Struts2中要设NAME的属性才能在Action中取到值,ID取不到. id与name的作用,作为标签的标识符,基本上是 ...
- Spring入门第十课
Spring表达式语言:SpEL Spring表达式语言(简称SpEL)是一个支持运行时查询和操作对象图的强大的表达式语言. 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都 ...
- LeetCode: 669 Trim a Binary Search Tree(easy)
题目: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so th ...
- MVC动态生成的表单:表单元素比较多 你就这样写
MVC动态生成的表单:表单元素比较多 你就这样写: public ActionResult ShoudaanActionResult(FormCollection from,T_UserM user) ...
- linux下安装QQ等EXE文件
安装好linux系统后,发现linux很多自带的软件用起来很不习惯,于是去网上下载QQ等在Windows下经常使用的exe文件. 发现这些文件无法安装,在网上找了一些解决办法,须下载wine,然后才可 ...
- python 模拟事件触发机制
EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...
- 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery
P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...