UVA-1632 Alibaba (区间DP+滚动数组)
题目大意:在一条直线上有n件珠宝,已知每件珠宝的位置,并且第 i 件珠宝在 ti 时刻就消失,问能否将所有的珠宝收集起来?如果能,求出最短时间。搜集能瞬间完成。
题目分析:区间DP。dp(i,j,0)表示搜集区间(i,j)并且停留在左端所需的最短时间,dp(i,j,1)表示搜集区间(i,j)并且停留在右端所需的最短时间。状态转移方程为
dp(i,j,0)=min(dp(i+1,j,0)+t(i+1)-t(i),dp(i+1,j1,)+t(j)-t(i)),dp(i,j,1)=min(dp(i,j-1,0)+t(j)-t(i),dp(i,j-1,1)+t(j)-t(j-1))。
这道题的数据规模比较大,可以用滚动数组优化空间复杂度。
代码如下:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; int dp[2][10005][2];
int x[10005],t[10005],n; const int INF=0x7fffffff; int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;++i){
scanf("%d%d",x+i,t+i);
dp[1][i][0]=dp[1][i][1]=dp[0][i][0]=dp[0][i][1]=(t[i]>0)?0:INF;
} for(int i=n-2;i>=0;--i){
for(int j=i+1;j<n;++j){
dp[i&1][j][0]=dp[i&1][j][1]=INF;
if(dp[(i&1)^1][j][0]!=INF&&dp[(i&1)^1][j][0]+x[i+1]-x[i]<t[i])
dp[i&1][j][0]=min(dp[i&1][j][0],dp[(i&1)^1][j][0]+x[i+1]-x[i]);
if(dp[(i&1)^1][j][1]!=INF&&dp[(i&1)^1][j][1]+x[j]-x[i]<t[i])
dp[i&1][j][0]=min(dp[i&1][j][0],dp[(i&1)^1][j][1]+x[j]-x[i]);
if(dp[i&1][j-1][0]!=INF&&dp[i&1][j-1][0]+x[j]-x[i]<t[j])
dp[i&1][j][1]=min(dp[i&1][j][1],dp[i&1][j-1][0]+x[j]-x[i]);
if(dp[i&1][j-1][1]!=INF&&dp[i&1][j-1][1]+x[j]-x[j-1]<t[j])
dp[i&1][j][1]=min(dp[i&1][j][1],dp[i&1][j-1][1]+x[j]-x[j-1]);
}
}
if(dp[0][n-1][1]==INF&&dp[0][n-1][0]==INF) printf("No solution\n");
else printf("%d\n",min(dp[0][n-1][0],dp[0][n-1][1]));
}
return 0;
}
下面这个是不加滚动数组的:
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std; int dp[10005][10005][2];
int x[10005],t[10005],n; const int INF=1000000000; int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;++i)
scanf("%d%d",x+i,t+i),dp[i][i][0]=dp[i][i][1]=0; for(int i=n-2;i>=0;--i){
for(int j=i+1;j<n;++j){
dp[i][j][0]=min(dp[i+1][j][0]+x[i+1]-x[i],dp[i+1][j][1]+x[j]-x[i]);
if(dp[i][j][0]>=t[i]) dp[i][j][0]=INF;
dp[i][j][1]=min(dp[i][j-1][0]+x[j]-x[i],dp[i][j-1][1]+x[j]-x[j-1]);
if(dp[i][j][1]>=t[j]) dp[i][j][1]=INF;
}
}
if(dp[0][n-1][1]==INF&&dp[0][n-1][0]==INF) printf("No solution\n");
else printf("%d\n",min(dp[0][n-1][0],dp[0][n-1][1]));
}
return 0;
}
UVA-1632 Alibaba (区间DP+滚动数组)的更多相关文章
- UVA - 1632 Alibaba (区间dp+常数优化)
题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...
- UVA - 1632 Alibaba 区间dp
题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...
- LG3004 「USACO2010DEC」Treasure Chest 区间DP+滚动数组优化
问题描述 LG3004 题解 把拿走的过程反向,看做添加的过程,于是很显然的区间DP模型. 设\(opt_{i,j}\)代表区间\([i,j]\)中Bessie可以获得的最大值,显然有 \[opt_{ ...
- HDU 1024 Max Sum Plus Plus --- dp+滚动数组
HDU 1024 题目大意:给定m和n以及n个数,求n个数的m个连续子系列的最大值,要求子序列不想交. 解题思路:<1>动态规划,定义状态dp[i][j]表示序列前j个数的i段子序列的值, ...
- POJ 3666 Making the Grade (DP滚动数组)
题意:农夫约翰想修一条尽量平缓的路,路的每一段海拔是A[i],修理后是B[i],花费|A[i] – B[i]|,求最小花费.(数据有问题,代码只是单调递增的情况) #include <stdio ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- USACO 2009 Open Grazing2 /// DP+滚动数组oj26223
题目大意: 输入n,s:n头牛 s个栅栏 输入n头牛的初始位置 改变他们的位置,满足 1.第一头与最后一头的距离尽量大 2.相邻两头牛之间的距离尽量满足 d=(s-1)/(n-1),偏差不超过1 3. ...
- UVa 1625 - Color Length(线性DP + 滚动数组)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- hdu 4576 (简单dp+滚动数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4576 题意:给出1~n的环,m个操作,每次能顺时针或逆时针走w步,询问最后在l~r这段区间内概率.(1 ...
随机推荐
- 【翻唱】Keep On Fighting
http://video.yingtu.co/0/77868591-502c-4af1-853b-d313e83c94a9.mp4 Keep On Fighting
- 一篇关于Redis的好文章
Redis作为缓存使用,在值大小为1k的情况下,可以支持到每秒近十万次的set操作,可见redis的运行效率是非常的高的.但是为什么我们还会有的时候会遇到redis的瓶颈呢?一般来说,都是因为我们没有 ...
- 02:BeautifulSoup
1.1 BeautifulSoup介绍 1.BeautifulSoup作用 1.BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化 2.之后遍可以使用他 ...
- 03: 自定义异步非阻塞tornado框架
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...
- Python3基础 str count 获得子字符串出现的次数
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- JavaScript:new function(){}和function(){}()
继:http://www.cnblogs.com/hongdada/p/3328089.html new function(){} function(){}(): 大概的总结: function(){ ...
- 关于 Local feature 和 Global feature 的组合
关于 Local feature 和 Global feature 的组合 1.全局上下文建模:
- hbase读写流程分析
前言 最近被大佬问到一个问题,hbase查询数据在最坏的场景下需要进行几次rpc,当时就懵了..下面主要对client端代码进行分析.阅读文章和看源码更配~ 读数据 流程总览 1. 从zookeepe ...
- BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...
- tyvj 2075 [NOIP2012T5]借教室 区间更新+二分
描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.面对海量租借教室的信息,我们自然希望编 ...