虽然它出现在dp专场里···但是我第一反应是一道最短路题···不过幸好它出现在dp专场里···因为我不怎么会dijstra什么的···

题意:一条河上有N+1对码头,每个相邻码头之间需要一定时间到达,每对码头之间也需要一定时间到达,如下图:

给出起点码头和终点码头,问最短到达时间。

解法:假设起点码头一定在左边,终点码头一定在右边,那么为了时间最短一定是向右或向上(下)走,所以dp数组为每个从起点出发到每个码头时的最短耗时,dp方程很好确定,但是上下码头的顺序无法确定,而当路径是由对面码头过来的时候,对面码头的dp值一定不是从当前码头而来,dp方程dp[0][i] = min(dp[0][i - 1] + time[0][i - 1], dp[1][i - 1] + time[1][i - 1] + time[2][i]),dp[1][i]
= min(dp[1][i - 1] + time[1][i - 1], dp[0][i - 1] + time[0][i - 1] + time[2][i])。

但从起点(终点)到它对面的时间需要另外处理,例如如下情况:

显然从南方的码头出发向右绕一圈后所需时间较短,所以要分别对起点通过左面路径到达对面码头的最短时间和终点通过右面路径到达对面码头的最短时间进行处理,绕行走的一定是U形路,所以只要计算所有U形路的最小时间,不过我还是用的dp写的···不是很好理解···

对于终点的绕行时间在最后要特殊处理,因为绕行时间和中间路径的dp过程有矛盾的地方。

一开始TLE了···但是我听说了某喵的惨痛经历后把memset改掉之后1900msA掉了···郁闷

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
struct node
{
long long num;
int dir;
};
long long dp[2][1000005];
long long c[3][1000005];
int main()
{
int n;
while(~scanf("%d", &n) && n)
{
for(int i = 0; i < 2; i++)
for(int j = 0; j < 1000005; j++)
dp[i][j] = -1;
//memset(dp, -1, sizeof(dp));
node st, fi;
scanf("%d%lld%d%lld", &st.dir, &st.num, &fi.dir, &fi.num);
if(st.num > fi.num)
{
node tmp = st;
st = fi;
fi = tmp;
}
dp[st.dir][st.num] = 0;
dp[fi.dir][fi.num] = 0;
for(int i = 0; i < n; i++)
scanf("%lld", &c[0][i]);
for(int i = 0; i <= n; i++)
scanf("%lld", &c[2][i]);
for(int i = 0; i < n; i++)
scanf("%lld", &c[1][i]);
for(int i = st.num - 1; i >= 0; i--)
dp[st.dir][i] = c[st.dir][i] + dp[st.dir][i + 1];
dp[!st.dir][0] = c[2][0] + dp[st.dir][0];
for(int i = 1; i <= st.num; i++)
dp[!st.dir][i] = min(dp[st.dir][i] + c[2][i], dp[!st.dir][i - 1] + c[!st.dir][i - 1]);
for(int i = fi.num + 1; i <= n; i++)
dp[fi.dir][i] = c[fi.dir][i - 1] + dp[fi.dir][i - 1];
dp[!fi.dir][n] = c[2][n] + dp[fi.dir][n];
for(int i = n - 1; i >= fi.num; i--)
dp[!fi.dir][i] = min(dp[fi.dir][i] + c[2][i], dp[!fi.dir][i + 1] + c[!fi.dir][i]);
for(int i = st.num + 1; i < fi.num; i++)
{
dp[0][i] = min(dp[0][i - 1] + c[0][i - 1], dp[1][i - 1] + c[1][i - 1] + c[2][i]);
dp[1][i] = min(dp[1][i - 1] + c[1][i - 1], dp[0][i - 1] + c[0][i - 1] + c[2][i]);
}
if(fi.num > 0)
{
dp[!fi.dir][fi.num] += dp[!fi.dir][fi.num - 1] + c[!fi.dir][fi.num - 1];
dp[fi.dir][fi.num] = min(dp[!fi.dir][fi.num], dp[fi.dir][fi.num - 1] + c[fi.dir][fi.num - 1]);
}
else
dp[fi.dir][fi.num] = dp[!fi.dir][fi.num];
cout << dp[fi.dir][fi.num] << endl;
}
return 0;
}

不想写注释了···就算写了我的代码也不会变的好读的QAQ

_(:з」∠)_

POJ 3377 Ferry Lanes的更多相关文章

  1. POJ 2609 Ferry Loading(双塔DP)

    Ferry Loading Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1807   Accepted: 509   Sp ...

  2. POJ 2609 Ferry Loading

    双塔DP+输出路径. 由于内存限制,DP只能开滚动数组来记录. 我的写法比较渣,但是POJ能AC,但是ZOJ依旧MLE,更加奇怪的是Uva上无论怎么改都是WA,其他人POJ过的交到Uva也是WA. # ...

  3. poj 2336 Ferry Loading II ( 【贪心】 )

    Ferry Loading II Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3704   Accepted: 1884 ...

  4. 【POJ3377】Ferry Lanes 最短路

    我仅仅是贴一下手写堆优化的dij模板.尽管.它.TLE了--**** #include <cstdio> #include <cstring> #include <ios ...

  5. POJ 3895 Cycles of Lanes (dfs)

    Description Each of the M lanes of the Park of Polytechnic University of Bucharest connects two of t ...

  6. poj 动态规划题目列表及总结

    此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...

  7. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

  8. POJ 动态规划题目列表

    ]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...

  9. poj 动态规划的主题列表和总结

    此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...

随机推荐

  1. centos修改ssh端口

    1.编辑防火墙配置:vi /etc/sysconfig/iptables防火墙增加新端口2222-A INPUT -m state --state NEW -m tcp -p tcp --dport ...

  2. easy ui datagrid 数据绑定

    1.前台页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  3. drag drop小游戏

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. spring的三种注解管理器

    1.依赖注入的注解解析器 在配置文件中; * xsd xmlns:context="http://www.springframework.org/schema/context" h ...

  5. 然爸读书笔记(2013-4)----打造facebook

    扎克伯格的真实一面 (1)在公司内部知无不言,扎克伯格在公司内部问答时间.尽可能回答员工的任何问题,保持足够的透明度. (2)员工只有做到对外守口如瓶,我们才能做到对内知无不言. (3)faceboo ...

  6. play2 控制台打印乱码问题

    修改 play安装目录下,framework/build.bat java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:Ma ...

  7. 1029: [JSOI2007]建筑抢修 - BZOJ

    Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修 ...

  8. tomcat启动报错:Unsupported major.minor version 51.0

    myeclipse中添加项目后,发现项目启动时报错:Unsupported major.minor version 51.0 因为tomcat使用的jdk版本不支持你项目的jdk版本,需要你在myec ...

  9. 阿里云PHP Redis代码示例

    测试代码示例 <?php /* 这里替换为连接的实例host和port */ $host = "localhost"; $port = 6379; /* 这里替换为实例id和 ...

  10. VO,DTO,DO,PO的划分

    实体类(VO,DTO,DO)的划分   经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应 ...