UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>
D - 最少花费
Time Limit: 30000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Bob是一个魔法师。这天,他被N座山所阻挡,这些山排成一排,每座山有一个高度。Bob需要从左往右每次跳到相邻的一座山上,相邻的两座山的高度差不能超过K,当从高度差为D的一座山跳到另一座山时要花A×D的魔法值。Bob可以改变一座山的高度,但调整后的高度不能小于0或大于1000,改变S的高度需要花费S×S的魔法值。现在已知每座山的高度,求Bob跳完所有山后魔法值的最少花费。
Input
第一行一个整数T(T≤150),表示数据组数。
每组第一行有3个整数N(1≤N≤1000), K(0≤K≤1000), A(0≤A≤1000)。
接下来N个整数,按从左往右的顺序表示山的高度,山的高度在0到1000之间。
Output
对于每组数据,输出一个整数,表示最少花费。
Sample input and output
Sample Input | Sample Output |
---|---|
2 |
0 |
解题报告:
我们令f( i , j ) 将第 i 座山高度改为 j 的最小花费.
F( i , j ) = min ( f( i – 1 , k ) + abs ( j – k ) + (i – h[i]) ^ 2)
不妨有 j > k
F( i , j ) = min ( f( i – 1 , k ) – k ) + j + (i – h[i]) ^ 2
即维护一个单调队列来更新 j > k的情况.
J < k 的情况同理.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
typedef long long ll;
using namespace std;
const int maxn = 1e3 + ;
int a,n,dl,q[maxn];
ll f[maxn][maxn],h[maxn]; int main(int argc,char *argv[])
{
int Case;
scanf("%d",&Case);
while(Case--)
{
scanf("%d%d%d",&n,&dl,&a); //DL = deeplimit
for(int i = ; i <= n ; ++ i)
scanf("%lld",&h[i]);
for(int i = ; i <= n ; ++ i)
for(int j = ; j <= ; ++ j)
f[i][j] = ;
for(int i = ; i <= ; ++ i)
f[][i] = (i-h[])*(i-h[]);
for(int i = ; i <= n ; ++ i)
{
int front = , rear = ;
for(int j = ; j <= ; ++ j)
{
while(rear > front && f[i-][q[rear-]] - a*q[rear-] >= f[i-][j] - a*j)
rear--;
q[rear++] = j;
while(rear - front > && j > q[front] + dl)
front++;
f[i][j] = min(f[i][j],(j-h[i])*(j-h[i]) + f[i-][q[front]] + (j - q[front]) * a);
}
front = rear = ;
for(int j = ; j >= ; -- j)
{
while(rear > front && f[i-][q[rear-]] + q[rear-]*a >= f[i-][j] + j*a)
rear--;
q[rear++] = j;
while(rear - front > && q[front] > j + dl)
front++;
f[i][j] = min(f[i][j],(j-h[i])*(j-h[i]) + f[i-][q[front]] + (q[front] - j) * a );
}
}
ll ans = ;
for(int i = ; i <= ; ++ i)
ans = min(ans,f[n][i]);
printf("%lld\n",ans);
}
return ;
}
UESTC_最少花费 2015 UESTC Training for Dynamic Programming<Problem D>的更多相关文章
- UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>
N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>
K - 摩天轮 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>
M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>
J - 男神的约会 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>
C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 262143/262143KB (Java/Others) Submi ...
- UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>
A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>
O - 酱神寻宝 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>
L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
- UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>
I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Su ...
随机推荐
- Shortest Word Distance 解答
Question Given a list of words and two words word1 and word2, return the shortest distance between t ...
- UVa232.Crossword Answers
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- Android学习笔记__2__Android工程目录结构
一.创建Android工程HelloWorld . src 文件夹里的是源文件 . Android2.2 是引用的类库,这些和 java 的都一样 . gen里面的类就是 ADT 自动生成的啦,一般只 ...
- 程序员求职之道(《程序员面试笔试宝典》)之求职有用网站及QQ群一览表
技术学习网站 www.csdn.com www.iteye.com www.51cto.com http://www.cnblogs.com/ http://oj.leetcode.com/ http ...
- wxpython 布局管理
一个典型的应用程序是由不同的部件.这些小部件被放进容器部件.一个程序员必须管理应用程序的布局.这不是一项容易的任务.在wxPython我们有两个选择. *absolute positioning*si ...
- Lua Table 操作
Lua中table类似与C#种的字典,其实就是一个key-value键值对数据结构.来学习下table基本操作 Table的创建 myTable = {} --表名后面使用{}赋值,表示一个空的表 m ...
- Apache POI组件操作Excel,制作报表(一)
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和Po ...
- Fabricate equation(dfs + 模拟)
Fabricate equation Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Other ...
- 一段代码说明javascript闭包执行机制
假设你能理解以下代码的执行结果,应该就算理解闭包的执行机制了. var name = "tom"; var myobj = { name: "jackson", ...