应当认为,有向无环图上的动态规划问题是动态规划的基本模型之一,对于某个模型,如果可以转换为某一有向无环图的最长、最短路径问题,则可以套用动态规划若干方法解决。

原题参见刘汝佳紫薯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 有向无环图的动态规划问题的更多相关文章

  1. 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 ...

  2. 洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)

    洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到 ...

  3. UVA1025-A Spy in the Metro(动态规划)

    Problem UVA1025-A Spy in the Metro Accept: 713  Submit: 6160Time Limit: 3000 mSec Problem Descriptio ...

  4. uva 1025 A Spy in the Metro 解题报告

    A Spy in the Metro Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug Secr ...

  5. 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 ...

  6. UVA 1025 -- A Spy in the Metro (DP)

     UVA 1025 -- A Spy in the Metro  题意:  一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, ...

  7. UVa 1025 A Spy in the Metro(动态规划)

    传送门 Description Secret agent Maria was sent to Algorithms City to carry out an especially dangerous ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. C 碎片六 函数

    一.程序编译执行过程 程序的编译执行过程分为4个阶段:预处理阶段.编译阶段.汇编阶段.连接阶段 1. 预处理阶段:预处理器(cpp)处理以头文件.宏.条件编译(字符#开头)等内容的替换.此阶段不进行语 ...

  2. 关于Arduino项目的构建思想-转自openbook开源杂志

  3. webapp一些样式记录

    图片外面的div设置宽高自适应width: 100vw; max-width: 640px; display: block; height: 43.75vw; max-height: 280px; f ...

  4. thinkphp搜索实现

    视图: <html lang="zh-cn"><head> <meta charset="UTF-8"><title& ...

  5. python super用法

    普通继承 class FooParent(object): def __init__(self): self.parent = 'I\'m the parent.' print 'Parent' de ...

  6. N 叉树的层序遍历

    给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...

  7. Java栈,PC寄存器,本地方法栈,堆,方法区(静态区)和运行常量池

    详情参考:https://my.oschina.net/wangsifangyuan/blog/711329 前言:当要判断一个变量存在什么空间上哪儿时,先分析它是哪一种(是实例变量还是局部变量),实 ...

  8. 数据类型 -- uint32_t 类型

    整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型 ...

  9. IOS NSBundle使用(访问文件夹)

    NSBundle的相关信息 1.一个NSBundle代表一个文件夹,利用NSBundle能访问对应的文件夹 2.利用mainBundle就可以访问软件资源包中的任何资源 3.模拟器应用程序的安装路径: ...

  10. clearerr, feof, ferror, fileno - 检查以及重置流状态

    总览 (SYNOPSIS) #include <stdio.h> void clearerr(FILE *stream); int feof(FILE *stream); int ferr ...