背景

小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主……

描述

守护者拿出被划分为n个格子的一个圆环,每个格子上都有一个正整数,并且定义两个格子的距离为两个格子之间的格子数的最小值。环的圆心处固定了一个指针,一开始指向了圆环上的某一个格子,你可以取下指针所指的那个格子里的数以及与这个格子距离不大于k的格子的数,取一个数的代价即这个数的值。指针是可以转动的,每次转动可以将指针由一个格子转向其相邻的格子,且代价为圆环上还剩下的数的最大值。

现在对于给定的圆环和k,求将所有数取完所有数的最小代价。

格式

输入格式

输入文件cirque.in的第1行有两个正整数n和k,描述了圆环上的格子数与取数的范围。

第2行有n个正整数,按顺时针方向描述了圆环上每个格子上的数,且指针一开始指向了第1个数字所在的格子。

所有整数之间用一个空格隔开,且不超过10000。

输出格式

输出文件cirque.out仅包括1个整数,为取完所有数的最小代价。

样例1

样例输入1[复制]

6 1
4 1 2 3 1 3

样例输出1[复制]

21

限制

对于20%的数据,n≤10,k≤3;
对于40%的数据,n≤100,k≤10;
对于60%的数据,n≤500,k≤20;
对于100%的数据,n≤2000,k≤500;

时限1s。

提示

如上图所示,第一步不转动指针,取走4、3两个数,代价为7;
第2步指针顺时针转动2格,圆环上最大数为3,代价为6,取走1、2、3两个数,代价为6;
第3步指针顺时针转动1格,代价为1,取走剩下的一个数1,代价为1;
最小代价为7+6+6+1+1=21。

--------------------------------------------------

该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死该死

取数的代价一定,只考虑转移

贪心发现能取就取一定不丢最优解,从1开始,剩下的一定一直是一段区间

然后我就开始做死了f[i][j][0/1]表示剩下[i,j]这段区间,0表示指针在i-k-1处,1表示指针在j+k+1处,调了三四个小时也没调出来

看人家的题解,i和j都来表示左/右“取了几个数”

然而我发现,他们的意思更准确的是左右的指针跳到了哪里

转移如代码,至于哪个>0否则INF,好像是简化了一下情况,不会丢失

该死该死该死

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,INF=1e9;
int n,k,a[N],f[N][N][],ans=INF,sum=;
int mx[N][];
void initRMQ(int n){
for(int i=;i<=n;i++) mx[i][]=a[i];
for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
}
int RMQ(int l,int r){
if(l>r) return ;
int k=log(r-l+)/log();
return max(mx[l][k],mx[r-(<<k)+][k]);
}
void dp(){
f[][n][]=f[][n][]=;
for(int i=;i<=n;i++)
for(int j=;j<=n-i;j++){
if(i==&&j==) continue;
int m=RMQ(i+k+,n-k-j);
if(i>) f[i][j][]=min(f[i-][j][]+m,f[i-][j][]+m*(i+j));
else f[i][j][]=INF;
m=RMQ(i+k+,n-k-j+);
if(j>) f[i][j][]=min(f[i][j-][]+m,f[i][j-][]+m*(i+j));
else f[i][j][]=INF;
}
}
int main(int argc, const char * argv[]) {
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]),sum+=a[i];
initRMQ(n);
dp();
for(int i=;i<=n;i++) ans=min(ans,min(f[i][n-i][],f[i][n-i][]));
cout<<ans+sum;
return ;
}

Vijos1451圆环取数[环形DP|区间DP]的更多相关文章

  1. NOIP2007 矩阵取数游戏(区间DP)

    传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? ...

  2. 洛谷 P1005 矩阵取数游戏 (区间dp+高精度)

    这道题大部分时间都在弄高精度-- 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的 ...

  3. luogu1005矩阵取数游戏题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...

  4. 洛谷 1063 dp 区间dp

    洛谷 1063 dp 区间dp 感觉做完这道提高组T1的题之后,受到了深深的碾压,,最近各种不在状态.. 初看这道题,不难发现它具有区间可并性,即(i, j)的最大值可以由(i, k) 与 (k+1, ...

  5. Vijos 1451 圆环取数 【区间DP】

    背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主…… 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...

  6. hdu 2167 方格取数 【状压dp】(经典)

    <题目链接> 题目大意: 给出一些数字组成的n*n阶矩阵,这些数字都在[10,99]内,并且这个矩阵的  3<=n<=15,从这个矩阵中随机取出一些数字,在取完某个数字后,该数 ...

  7. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  8. HDU1565 方格取数 &&uva 11270 轮廓线DP

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  9. hdu 1565 方格取数(1) 状态压缩dp

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. ArcGIS JS 学习笔记2 实现仿百度的拖拽画圆

    一.前言 吐槽一下,百度在国内除了百度地图是良心产品外,其他的真的不敢恭维.在上一篇笔记里,我已经实现了自定义的地图测量模块.在百度地图里面(其他地图)都有一个周边搜索的功能,拖拽画一个圆,然后以圆半 ...

  2. 对称密码-DES和3DES

    最近在看信息安全的知识,就总结了一下自己所学到知识. 先说一下什么是对称密码算法,什么是对称密码算法呢?对称密码算法是指有了加密密钥就可以推算出解密密钥,有了解密密钥就可以推算出加密密钥的的算法. 那 ...

  3. Android线程优先级设置方法技巧

    对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题, 比如很多无关紧要的线程会占用大量的CPU时间,虽然通过了MultiThread来解决慢速I/O但是合理分配优先级对于并发编 ...

  4. 【C语言】C语言运算符

    目录: [算术运算符] [自增运算符] [自减运算符] [关系运算符] [逻辑运算符] [三目运算符] [sizeof运算符] · 作用 1.算术运算符 +(加).-(减).*(乘)./(除).%(取 ...

  5. 【iOS】环形渐变进度条实现

    之前有人在找渐变进度条的效果,闲来无事就顺手写了一个,然后画了视图层级,方便讲解. 环境信息: Mac OS X 10.10.3 Xcode 6.3.1 iOS 8.3 效果图: 源码下载地址: ht ...

  6. Fragment与Activity之间的通信

      我个人将Fragment与Activity间的通信比喻为JSP与Servlet间的通信,fragment中用接口的方式来进行与Activity的通信.通信的结果可以作为数据传入另一个Fragmen ...

  7. js中转换Date日期格式

    在javascript中直接输出Date得到的结果是这样的: function date(){ var date = new Date(); alert(date); } 结果是:Mon Jun 15 ...

  8. 转:能和LoadRunner匹敌的VS2010/2012Web负载测试

    原文出处:http://www.cnblogs.com/aarond/archive/2013/04/18/performance.html VS自带的Web负载测试真的很大程度上能和专业的loadr ...

  9. 算法导论( FFT & 自动机 & 最优二叉搜索树 !!!)

    原图链接:(!!!)

  10. 3、软件评测师要阅读的书籍 - IT软件人员书籍系列文章

    软件评测师在项目组的作用也是非常大的.微软的做法是一个软件工程师搭配两个软件评测师,这样能够减少软件系统存在的问题.但是,笔者发现,软件评测在这些年的发展还是比较缓慢的,除了人力进行的测试外,就是软件 ...