UVA_1025 a Spy in the Metro 有向无环图的动态规划问题
应当认为,有向无环图上的动态规划问题是动态规划的基本模型之一,对于某个模型,如果可以转换为某一有向无环图的最长、最短路径问题,则可以套用动态规划若干方法解决。
原题参见刘汝佳紫薯267页。
在这个题目中,首先将整个模型规划成为有向无环图的模式:
1,对于某小特工,于j时间处在在第i站,可以成为一个独立的状态,也就是有向无环图的一个节点。
2,对于每个节点,可能能够走得有三个不同的边——坐火车往左走,进入左边的某个状态;坐火车往右走,进入右边的某个状态;原地等待,进入该站点的下一个时间。
每条边,拥有权重——坐火车边权位0,但是原地等待边权位1.,由此,可以将动态规划的问题描述成为一个有向无环图上的寻路问题。直觉上至少可以使用最短路算法。
但是对于有向无环图情况,可以进行特殊的优化:使用直接刷表法求得。
之前,我们大多使用“对于每个节点进行扫描的时候更新该节点的所有子节点中某值,从而使得,该节点得到最优解”。但是很多时候,并不一定可以使用这种思路来进行很直观的赋值。在这种情况下,我们可以退而求其次,通过若干次计算,在到达某一节点之后“更新”可能直接到达的节点的边权,从而得到,我们需要的最值。
这道题在做的时候,感觉到有些比较深的坑——例如初始化的故事。
AC代码:
#include<bits/stdc++.h>
using namespace std; const long long MAXN=;
const long long INF=1e9+;
long long n,t,m1,m2;
long long ti[MAXN];
long long d1[MAXN];
long long d2[MAXN];
bool check[MAXN][MAXN][];
long long dp[MAXN][MAXN]; long long ca=;
void init()
{
memset(check,,sizeof(check));
memset(ti,,sizeof(ti));
memset(d1,,sizeof(d1));
memset(d2,,sizeof(d2));
cin>>t;
for(int i=;i<n-;++i) cin>>ti[i];
cin>>m1;
for(int i=;i<m1;++i) cin>>d1[i];
cin>>m2;
for(int i=;i<m2;++i) cin>>d2[i];
check[][d1[]][]=;check[n-][d2[]][]=; for(int i=;i<MAXN;++i)
{
for(int j=;j<MAXN;++j)dp[i][j]=INF;
}long long time=;
for(int i=;i<n-;++i)
{ for(int j=;j<m1;++j)
{
check[i][d1[j]+time][]=;
// cout<<"left: "<<i<<ends<<d1[j]+time<<endl;
}time+=ti[i];
}
time=;
for(int i=n-;i;--i)
{
time+=ti[i];
for(int j=;j<m2;++j)
{
check[i][d2[j]+time][]=;
// cout<<"right: "<<i<<ends<<d2[j]+time<<endl;
}
}dp[][]=;
for(int j=;j<=t;++j)
{
for(int i=;i<n;++i)
{
if(dp[i][j]>=INF)continue;
dp[i][j+]=min(dp[i][j]+,dp[i][j+]);
if(i<n-&&check[i][j][])dp[i+][j+ti[i]]=min(dp[i][j],dp[i+][j+ti[i]]);//,cout<<"check_left "<<i<<ends<<j<<ends<<dp[i][j]<<endl;
if(i&&check[i][j][])dp[i-][j+ti[i-]]=min(dp[i][j],dp[i-][j+ti[i-]]);//,cout<<"check_right "<<i<<ends<<j<<ends<<dp[i][j]<<endl;
}
}
cout<<"Case Number "<<ca++<<": ";
if(dp[n-][t]<INF)cout<<dp[n-][t]<<"\n";
else cout<<"impossible\n"; } int main()
{
cin.sync_with_stdio(false);
while(cin>>n&&n)init(); return ;
}
UVA_1025 a Spy in the Metro 有向无环图的动态规划问题的更多相关文章
- UVA - 1025 A Spy in the Metro[DP DAG]
UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ...
- 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)
洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...
- UVA1025-A Spy in the Metro(动态规划)
Problem UVA1025-A Spy in the Metro Accept: 713 Submit: 6160Time Limit: 3000 mSec Problem Descriptio ...
- uva 1025 A Spy in the Metro 解题报告
A Spy in the Metro Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug Secr ...
- uva A Spy in the Metro(洛谷 P2583 地铁间谍)
A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especially dangero ...
- UVA 1025 -- A Spy in the Metro (DP)
UVA 1025 -- A Spy in the Metro 题意: 一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, ...
- UVa 1025 A Spy in the Metro(动态规划)
传送门 Description Secret agent Maria was sent to Algorithms City to carry out an especially dangerous ...
- UVA1025---A Spy in the Metro(DP)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913 Secret agent Maria was sent to Alg ...
- UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】
Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...
随机推荐
- C 碎片三 运算符与表达式
一.算术运算符 算术运算符:+. -. *. /. %等 加:+ 减: - 乘: * 除: / 除数不能为0 模:% 参与模运算的数据不能为小数 二.赋值运算符 赋值运算符:= 作用: ...
- 移动端真机调试工具--DebugGap (VIDE)
越来越多的移动端开发工作,需要我们有一个好的调试工具,以解决各类真机才会遇到的BUG,最近使用了一款DebugGap 的工具,非常方便,在这里推荐给大家. 官网地址 DebugGap . 按需求下载 ...
- nginx停止后再启动出现: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误的解决方法
为了备份数据 手动停止了服务器的nginx 结果启动时报错 nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" fail ...
- Java图形界面开发—简易登录注册小程序
登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象.本例中如果有注释不详细的地方,详见其它博客. Java程序操作数据库SQLserver详解 功能介绍:简单的登录注册系统,使用了数据库 ...
- Android rxjava2的disposable
rxjava+retrofit处理网络请求 在使用rxjava+retrofit处理网络请求的时候,一般会采用对观察者进行封装,实现代码复用和拓展.可以参考我的这篇文章:rxjava2+retrofi ...
- Android Broadcast Receive
Broadcast Receive 广播接收(Broadcast Receive)为android的四大组件之一.主要用于监听广播消息,并做出响应.与应用程序中监听事件相比而言,该监听事件为全局监听. ...
- 条件注解@Conditional
通过活动的profile,可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditonal注解 @Conditional根据满足某一个特定条件创建一个特定 ...
- jquery mmgrid使用
参考 http://miemiedev.github.io/mmGrid/examples/index.html
- centos6.5_64bit-nginx安装部署
1.配置防火墙,开启80端口.3306端口 vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dpor ...
- 卸载gitlab
一.停止gitlab sudo gitlab-ctl stop 二.卸载gitlab sudo rpm -e gitlab-ce三.查看gitlab进程 杀掉第一个守护进程 kill -9 4473 ...