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

原题参见刘汝佳紫薯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 碎片三 运算符与表达式

    一.算术运算符 算术运算符:+. -. *. /. %等 加:+ 减: - 乘: * 除: /     除数不能为0 模:%    参与模运算的数据不能为小数 二.赋值运算符 赋值运算符:= 作用: ...

  2. SpringMVC 返回实体对象时屏蔽某些属性

    SpringMVC 可以直接已JSON的结果返回实体对象,可是返回时是所有属性与属性值都会一并返回, 怎样才能屏蔽某些属性?方法很简单,只要在实体对象类中要屏蔽的属性值上加 @JsonIgnore 注 ...

  3. hibernate课程 初探单表映射2-2 hibernate常用配置

    1 hibernate.cfg.xml常用配置: show_sql 控制台打印sql format_sql 控制台将sql排版 hbm2ddl.auto: create 删除表结构,重新建表并插值 u ...

  4. 洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)

    题意 题目链接 求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同 Sol 这种题,直接爆搜啊... 打表后不难发现$<=1e18$的fib数只有88个 最先想到的 ...

  5. JQuery初识(二)

    一丶链式编程 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. JS 获取 今日、昨日、本周、本月、本季度、本年、上月、上周、上季度、去年

    /** * 日期范围工具类 */ var dateRangeUtil = (function () { /*** * 获得当前时间 */ this.getCurrentDate = function ...

  7. zblog添加水印插件后出现Cannot use $this as parameter

    安装了水印插件后后台也进不去了,页面错误提示:Cannot use $this as parameter 删除水印插件文件后恢复正常,具体原因待研究 水印插件文件:/zb_users/plugin/W ...

  8. HDU 1114 Piggy-Bank 猪仔储钱罐(完全背包)

    题意: 给定一个存钱罐中要存硬币,知道空罐的重量和欲装满的重量,是否能装入?若能,打印最小价值.(注:能装的硬币重量一定刚刚好,里面的总价值要达到最小) 输入: 包含了T个测试例子,在第一行给出.接下 ...

  9. 302和VS启动后网站拒绝访问的解决方案

    网页状态302代表的是重定向的意思,就是网页跳转的一种状态 网站拒绝访问的时候可以在输出窗口查看是否有内容输出,如果没有说明启动网站的端口可能被占用,在网站项目——属性——web——项目中把地址的端口 ...

  10. World Wind Java开发之十二——加载粗制三维模型(ExtrudedPolygon)(转)

    ww可以根据DLG图批量生成假三维模型,这对于小区等特征相似的建筑物模型的构建是非常有用的.下面来看如何一步步实现假三维模型的加载: 1.Shp文件的制作 首先在arcmap下数字化几个建筑物,并新建 ...