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

原题参见刘汝佳紫薯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. 程序员从初级到中级10个秘诀——摘自CSDN

    程序员从初级到中级10个秘诀 1.学习先进的搜索技术.手段和及策略 2.帮助别人 教别人始终是学习一切东西的最好方法之一.相对而言,由于你在开发领域还是个新手,认为自己没什么可教给人家的,这可以理解. ...

  2. .net笔试题一(简答题)

    1. 简述 private. protected. public. internal 修饰符的访问权限答:private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类 ...

  3. Get和Post的请求

    get post请求 <form method="post","get", action="a.ashx"> <input ...

  4. $.ajax和$.load的区别

    http://lib.csdn.net/article/jquery/35614?knId=646

  5. Every ending is just a new beginning.

    Every ending is just a new beginning.每次结束都是新的开始.

  6. IOS微信6.7.4输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置

    近期在开发微信H5页面时碰到这个问题,如图,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,这也是ios的微信版本更新6.7.4之后才遇到的bug. 目前 ...

  7. Android接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  8. Head First HTML与CSS阅读笔记(一)

    之前写过不少前端界面,但是没有完整阅读过一本HTML与CSS的书籍,都是用到什么查什么,最近闲暇之余想巩固加深一下前端基础方面的知识,阅读了<Head First HTML与CSS>,感觉 ...

  9. 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.3 到 12.1.0.2 [发行版 11.2 到 12.1]本文档所含信息适用于所有平台 用 ...

  10. 【洛谷4149】[IOI2011] Race(点分治)

    点此看题面 大致题意: 给你一棵树,问长度为\(K\)的路径至少由几条边构成. 点分治 这题应该比较显然是点分治. 主要思路 与常见的点分治套路一样,由于\(K≤1000000\),因此我们可以考虑开 ...