POJ 3377 Ferry Lanes
虽然它出现在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的更多相关文章
- POJ 2609 Ferry Loading(双塔DP)
Ferry Loading Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1807 Accepted: 509 Sp ...
- POJ 2609 Ferry Loading
双塔DP+输出路径. 由于内存限制,DP只能开滚动数组来记录. 我的写法比较渣,但是POJ能AC,但是ZOJ依旧MLE,更加奇怪的是Uva上无论怎么改都是WA,其他人POJ过的交到Uva也是WA. # ...
- poj 2336 Ferry Loading II ( 【贪心】 )
Ferry Loading II Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3704 Accepted: 1884 ...
- 【POJ3377】Ferry Lanes 最短路
我仅仅是贴一下手写堆优化的dij模板.尽管.它.TLE了--**** #include <cstdio> #include <cstring> #include <ios ...
- POJ 3895 Cycles of Lanes (dfs)
Description Each of the M lanes of the Park of Polytechnic University of Bucharest connects two of t ...
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- poj动态规划列表
[1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...
- POJ 动态规划题目列表
]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...
- poj 动态规划的主题列表和总结
此文转载别人,希望自己可以做完这些题目. 1.POJ动态规划题目列表 easy:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, ...
随机推荐
- Web前端框架学习成本比较及学习方法
就项目中自己用过的前端框架的学习成本比较与学习心得分享 刚工作时间不长只用过这几个框架下面是难易程度比较: 不论哪个web前端框架, 究其本质都是把页面的数据传递给后台服务器语言(如java)进行处理 ...
- Qt多国语言
项目中需要多语言的部分以tr宏包含 例:setWindowTitle(tr("编辑")); .pro项目文件加入CODECFORTR = utf-8 #or gbk#DEFAULT ...
- 使用NodeJS+AngularJS+MongoDB实现一个Web数据扒取-分析-展示的系统
说到Web爬虫,Python占了半壁江山.但是Web页面不是Python的强项了,如果需要扒取Web数据,再Mashup出来一个自己的系统,全端JS是个不错的解决方案(其实不用Python扒数据是因为 ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- C++转换unicode utf-8 gb2312编码
windows开发环境下用VC++6.0 对unicode .utf-8. gb2312 三种编码格式之间的转换方法: #include <iostream> #include <s ...
- 【leetcode】4Sum(middle)
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- Codeigniter开发技巧:连接多个数据库(可实现DB读写分离)
在开发中,我们有时候会遇到在同一程序中链接多个数据库的需求,这对Codeigniter框架来说是很简单的,我们只需要在 database.php文件中配置少许参数即可. 默认情况下,CI配置的是链接一 ...
- POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)
题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...
- [itint5]三数和为0
http://www.itint5.com/oj/#20 其实是3sum的变种,有重复数字,但是一开始还是写错了.其实是选定一个后,在右边剩余数组里找2sum,找到一组后继续找. #include & ...
- 【mysql的设计与优化专题(3)】字段类型与合理的选择字段类型
本篇博客稍微有点长,它实际上包括两个内容:一是mysql字段类型的介绍,二是在mysql建表过程中是如何正确选择这些字段类型; 字段类型 数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是 ...