背景

小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=2005,INF=1e9;
int n,k,a[N],f[N][N][2],ans=INF,sum=0;
int mx[N][16];
void initRMQ(int n){for(int i=1;i<=n;i++) mx[i][0]=a[i];for(int j=1;j<=12;j++)for(int i=1;i+(1<<j)-1<=n;i++)mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
}
int RMQ(int l,int r){if(l>r) return 0;int k=log(r-l+1)/log(2);return max(mx[l][k],mx[r-(1<<k)+1][k]);
}
void dp(){f[1][n][0]=f[1][n][1]=0;for(int i=0;i<=n;i++)for(int j=0;j<=n-i;j++){if(i==0&&j==0) continue;int m=RMQ(i+k+1,n-k-j);if(i>0) f[i][j][0]=min(f[i-1][j][0]+m,f[i-1][j][1]+m*(i+j));else f[i][j][0]=INF;m=RMQ(i+k+2,n-k-j+1);if(j>0) f[i][j][1]=min(f[i][j-1][1]+m,f[i][j-1][0]+m*(i+j));else f[i][j][1]=INF;}
}
int main(int argc, const char * argv[]) {scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum+=a[i];initRMQ(n);dp();for(int i=1;i<=n;i++) ans=min(ans,min(f[i][n-i][1],f[i][n-i][0]));cout<<ans+sum;return 0;
}

Vijos1451圆环取数[环形DP|区间DP]相关推荐

  1. 【每日DP】day 10、P1005 矩阵取数游戏【区间DP+高精(python)】难度⭐⭐⭐★

    P1005 矩阵取数游戏 输入 2 3 1 2 3 3 4 2 输出 82 说明/提示 NOIP 2007 提高第三题. 数据范围: 60%60\%60% 的数据满足:1≤n,m≤301\le n,m ...

  2. [蓝桥杯][算法训练VIP]方格取数(双线程dp)

    题目描述 设有N * N的方格图(N< =10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下 ...

  3. 【算法基础】DP第一弹 —— 线性DP 区间DP

    一.数字三角形 (一)Question 1. 问题描述 2. Input 第一行包含整数 n,表示数字三角形的层数.接下来 n 行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数. ...

  4. AcWing 320. 能量项链(环形区间DP)

    AcWing 320. 能量项链(环形区间DP) 一. 问题: 二.分析: 三.代码 一. 问题: 二.分析: 在讲解这道题之前,大家需要对线性区间DP和环形区间DP有一定的了解,因此如果不会这两个知 ...

  5. CSUOJ-1980 不堪重负的数(区间dp)

    1980: 不堪重负的树 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 57  ...

  6. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  7. (详解)区间DP —— 平行四边形优化

    本文从普通区间dp.平行四边形优化区间dp.例题三个步骤,详细分析了区间动态规划!!! 编写不宜,希望各位兄台耐心阅读完整!!! 1.区间dp 区间dp其实就是一种建立在线性结构上的整体上对区间的动态 ...

  8. 动态规划 —— 区间 DP

    [概述] 区间型动态规划,又称为合并类动态规划,是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的区间中哪些元素合并而来有很大的关系. [思想] 区间 DP 实质上就是 ...

  9. LA 4394 String painter 区间DP -

    题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...

最新文章

  1. 微机原理—定时计数控制接口
  2. 了解下RDF 主要元素
  3. 移动商城第五篇【查看、删除、编辑品牌】
  4. 1.9 Java转换流:InputStreamReader和OutputStreamWriter
  5. 计算机视觉和图形学中的摄像机内参数矩阵详解
  6. python 三引号_Python 简明教程 --- 4,Python 变量与基本数据类型
  7. JAVA知识基础(二):基本语法
  8. POS打印机系列之 = 并口
  9. 烂泥:团购网站的购买流程
  10. 详解 ML2 Core Plugin(II) - 每天5分钟玩转 OpenStack(72)
  11. Java是否存在内存泄露
  12. SAP MM物料管理系统功能详解
  13. kali-Linux局域网渗透之Win2008
  14. 关于毕业:三方协议、派遣证、干部身份等常识
  15. C语言的主要用途以及未来发展
  16. 华为荣耀开机停留在android,华为荣耀8变砖无法开机怎么办 华为荣耀8变砖无法开机解决方法...
  17. 三菱FX3U编程口通信协议
  18. 第一部分_SQL查询语句学习
  19. 利用Simulink生成自定义的A2L
  20. 剑指Offer——联通研究院笔、面试题 (Offer-1已收割)

热门文章

  1. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
  2. Windows文件被占用解决办法
  3. dataTable调用接口渲染数据,没有数据,报错
  4. wap问答系统工作总结
  5. spring 配置文件 数据库引入
  6. oracle clob 存储大于4000字符的字符串
  7. Shell函数返回值、删除函数、在终端调用函数
  8. Delphi下使用OpenOffice+JodConverter+SWFtools进行文件转换
  9. [CPyUG] Instagram被收购了一细看,python味很重的说。 - maolingzhi@gmail.com - Gmail
  10. ASP.net 2.0 Migrating系列 - Master Pages 感触