背景

小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. 为什么URL中的中文需要Encode两次?

    在URL中传参的时候常常需要传入中文,这个时候就需要对中文参数进行编码,即URLEncode.但是,常常是Encode两次,而不是一次,为什么呢? 首先要知道,tomcat会自动解码一次: 这样的话, ...

  2. sizzle源码分析 (1)sizzle架构

    sizzle是jquery的核心,它用来选择匹配的元素,其代码包含在一个匿名函数中,并以window作为其上下文环境: (function( window, undefined ) { //此处为si ...

  3. Repeater分页代码

    //ASP.NET中的DataList和Repeater提供了简单快速的方法來显示,其间,我们可以使用<ItemTemplate>更是使我们能随心所欲的控制数据的排放样式! //.可惜的是 ...

  4. java类 对象 和构造方法

    github地址:https://github.com/lily1010/java_learn/tree/master/dog java中对象和类 java中万物皆对象,比如说动物,里面有猫,狗,鱼等 ...

  5. Android 4.4 KitKat 新特性

    New in Android 4.4 KitKat 本文是一个概览,关于KitKat,也即Android4.4的新东西,先是功能型的,之后是设计上的. 很多特性本文并没有提到,很多提到的特性也只是简短 ...

  6. 【代码笔记】iOS-浮动的云

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  7. UILabel和NSAttributedString那些事

    注:通常的label用来现实普通的文字.但是,你常常会遇到这样的情况:一段文字中不仅有文字,也有图片,甚至文字中的某段文字与其他的文字的appearance不一致的情况,这样的一段文字就可以称得上是富 ...

  8. Oracle与MySQL的区别

    1. Oracle是大型数据库而Mysql是中小型数据库,Oracle市场占有率达40%,Mysql只有20%左右,同时Mysql是开源的而Oracle价格非常高. 2. Oracle支持大并发,大访 ...

  9. Photo Shop 修改、维护

    调整画布大小 要继续放更多的图片? 更改画布大小 移动图标 若图标为独立图层,则用移动工具拖动即可 若图层为非独立图层 - 用选区工具选中图标区域 - 用移动工具拖动图标 如果要拆分同一图层下的两个图 ...

  10. 跨域iframe的高度自适应

    If you cannot hear the sound of the genuine in you, you will all of your life spend your days on the ...