题目大意:长城(视作x正半轴)有n处破损。有一个智能修复机器人,它的初始位置和移动速度已知。每处破损处都有一组参数(x,c,d),x表示位置,c、d表示在时间t后再修复该处破损的花费为d*t+c。求用一个机器人修复所有破损的最小花费。

题目分析:要想最终代价最低,就不能跳跃着修复,也就是经过一段时间后已经修复好的破损应是一段连续区间。定义dp(i,j,k)表示修好(i,j)后机器人停留在k(0表示在左端,1表示在右端)端的费用。修复某处破损的代价虽然不是定值,但却是随着时间线性增长的,所以当修复完一处或一段破损时,修复其他破损的费用可以算出来,只需将其累加到当前状态即可,也可以视作修复某处破损产生的时间代价。状态转移方程:dp(i,j,1)=min(dp(i,j-1,0)+w1,dp(i,j-1,1)+w2)  dp(i,j,0)=min(dp(i+1,j,0)+w3,dp(i+1,j,1)+w4) 其中,w1、w2、w3、w4为相应产生的时间代价与修复代价的和。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<algorithm>
using namespace std; const int N=1005;
const double inf=1e30; struct P
{
int x,c,dlt;
bool operator < (const P &a) const{
return x<a.x;
}
};
P p[N];
int n,v,x;
double dp[N][N][2],s[N]; double dfs(int l,int r,int k)
{
if(dp[l][r][k]>-1.0) return dp[l][r][k];
if(l==r){
double t=fabs((double)x-(double)p[l].x)/(double)v;
dp[l][r][k]=s[n]*t+p[l].c;
return dp[l][r][k];
}
if(k==0){
double a=dfs(l+1,r,0);
double b=dfs(l+1,r,1);
double t1=(double)(p[l+1].x-p[l].x)/(double)v;
double t2=(double)(p[r].x-p[l].x)/(double)v;
double d=s[l]+s[n]-s[r];
dp[l][r][k]=min(a+d*t1,b+d*t2)+(double)p[l].c;
}else{
double a=dfs(l,r-1,0);
double b=dfs(l,r-1,1);
double t1=(double)(p[r].x-p[l].x)/(double)v;
double t2=(double)(p[r].x-p[r-1].x)/(double)v;
double d=s[l-1]+s[n]-s[r-1];
dp[l][r][k]=min(a+d*t1,b+d*t2)+p[r].c;
}
return dp[l][r][k];
} void look()
{
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
printf("%.lf ",dp[i][j][0]);
cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
printf("%.lf ",dp[i][j][1]);
cout<<endl;
}
} int main()
{
//freopen("UVA-1336 Fixing the Great Wall.txt","r",stdin);
while(~scanf("%d%d%d",&n,&v,&x))
{
if(n+v+x==0) break;
for(int i=1;i<=n;++i)
scanf("%d%d%d",&p[i].x,&p[i].c,&p[i].dlt);
sort(p+1,p+n+1);
s[0]=0.0;
for(int i=1;i<=n;++i) s[i]=s[i-1]+(double)p[i].dlt;
memset(dp,-1.0,sizeof(dp));
printf("%d\n",(int)min(dfs(1,n,0),dfs(1,n,1)));
//look();
}
return 0;
}

  

UVA-1336 Fixing the Great Wall(区间DP)的更多相关文章

  1. UVa 1336 Fixing the Great Wall (区间DP)

    题意:给定 n 个结点,表示要修复的点,然后机器人每秒以 v 的速度移动,初始位置在 x,然后修复结点时不花费时间,但是如果有的结点暂时没修复, 那么每秒它的费用都会增加 d,修复要花费 c,坐标是 ...

  2. 【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall

    UVa 10618 Fixing the Great Wall 题目:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=361 ...

  3. UVA 10529 - Dumb Bones(概率+区间dp)

    UVA 10529 - Dumb Bones option=com_onlinejudge&Itemid=8&category=518&page=show_problem&am ...

  4. uva 10304 - Optimal Binary Search Tree 区间dp

    题目链接 给n个数, 这n个数的值是从小到大的, 给出个n个数的出现次数. 然后用他们组成一个bst.访问每一个数的代价是这个点的深度*这个点访问的次数. 问你代价最小值是多少. 区间dp的时候, 如 ...

  5. UVA 10891 Game of Sum(区间DP(记忆化搜索))

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. uva 10453 【回文串区间dp】

    Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...

  7. UVA - 10891 Game of Sum (区间dp)

    题意:AB两人分别拿一列n个数字,只能从左端或右端拿,不能同时从两端拿,可拿一个或多个,问在两人尽可能多拿的情况下,A最多比B多拿多少. 分析: 1.枚举先手拿的分界线,要么从左端拿,要么从右端拿,比 ...

  8. UVA 1626 区间dp、打印路径

    uva 紫书例题,这个区间dp最容易错的应该是(S)这种匹配情况,如果不是题目中给了提示我就忽略了,只想着左右分割忘记了这种特殊的例子. dp[i][j]=MIN{dp[i+1][j-1] | if( ...

  9. 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 ...

随机推荐

  1. vs 开发常用快捷键

    alt+shift+enter    编辑区最大化ctrl+]        括号匹配 ctrl+j        强迫智能感知ctrl+shift+空格    强迫智能感知(参数) ctrl+k+d ...

  2. [Python模块学习]用qrcode模块生成二维码

    转自:https://blog.csdn.net/jy692405180/article/details/65937077

  3. Python开发【Django】:基础

    Django基本配置 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Se ...

  4. django的framework优化

    1.优化framework的性能,解决restapi调用慢的问题 ①预加载,关联查询时做缓存,序列化前简单调用setup_eager_loading ,这个需要确定sql查询调用情况(根据数据库结构确 ...

  5. 小米范工具系列之十:小米范SSH批量命令执行工具

    小米范SSH批量命令执行工具的主要功能是自动登录多台机器,并执行指定的命令,比如批量抓取shadow.批量获取系统版本.或者做基线时批量抓取配置等. 此工具使用java 1.8以上版本运行. 界面如下 ...

  6. Mybatis三剑客之mybatis-generator配置

    mybatis插件在这里: 然后把generatorConfig.xml文件放在resources下: <?xml version="1.0" encoding=" ...

  7. Ubuntu操作异常汇总

    1.使用Ubuntu的apt-get安装软件时出现以下错误: Reading package lists... Done Building dependency tree... Done Packag ...

  8. PhotoSwipe中文API(一)

    入门 您应知道之前先做起事情: 1. PhotoSwipe不是一个简单的jQuery插件,至少基本的JavaScript知识才能安装. 2. PhotoSwipe需要预定义的图像尺寸(更多关于这一点) ...

  9. 索引查找Java实现

    package 索引查找; import java.util.Scanner; public class IndexSearch { public static long stu[] = { 1080 ...

  10. cocos-lua基础学习(九)spite类学习笔记

    创建精灵 ,) ) layer:addChild( sprite ) ) layer:addChild(BatchNode, , kTagSpriteBatchNode) ,) ) layer:add ...