虽然它出现在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. excle,aspose.cells 公式字段值取不到 xmls转xml

    问题: 一,单元格如果是公式的,读出值为0 aspose.cells 4.4.0.5版本 由于太低,读xmls后缀的excel文件时,发现如果此列是公式算出来的,值是获取不到的.获取到的值一直是0 二 ...

  2. IOS开发之表视图添加索引

    我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface  ...

  3. HDU 3487 Splay

    给定两种操作,一种是把一个数列的某一段切下来插到剩余数列的某一个位置上. 一种是翻转操作,把数列的某一段进行翻转. 都是Splay的基本操作.标准的Rotateto调整出 [a,b]区间.然后对[a, ...

  4. 0ffice365 Calendar API

    Calendar REST API in Office 365 APIs Preview http://msdn.microsoft.com/EN-US/library/office/dn792114 ...

  5. js 判断对象相等

    文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个 ...

  6. springMVC从上传的Excel文件中读取数据

    示例:导入客户文件(Excle文件) 一.编辑customer.xlsx 二.在spring的xml文件设置上传文件大小 <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1 ...

  7. 增强LSH

    通过LSH hash functions我们能够得到一个或多个hash table,每个桶内的数据之间是近邻的可能性很大.我们希望原本相邻的数据经过LSH hash后,都能够落入到相同的桶内,而不相邻 ...

  8. mysql deadlock处理

    1.SHOW ENGINE INNODB STATUS 得到最后一次死锁发生的状况 =====================================140110 11:43:07 INNOD ...

  9. 16进制字符串转数字(C/C++,VB/VB.net,C#)

    这个问题看是很简单,但是在不同语言中实现的方式却千差万别,如果不知道方法,还真是麻烦,我就是在C#中遇到该问题,让我费了很大的周折,才在msdn查到. 一.16进制字符串转数字      1.C/C+ ...

  10. 2026-Keroro侵略地球

    描述 Keroro来侵略地球之前,曾跟Giroro伍长打赌:“我一个人灭掉整个地球给你看!”. 于是Keroro同学真的自己一个人来到地球开始他的侵略行动了.从K隆星出发之前,Keroro从Kurur ...