这是紫书上的第一个dp哈。

1.状态定义:dp[i][j]---->到时刻i的时候(出发的时候时刻为0,约定时间为时刻time),从j号车站开往N号车站,在车站等待的最少的时间。

2.这个人当前的策略:

α.在车站等待一个单位的时间(该站此时没有发车时应该这么做)

β.坐上开往左边的火车

γ.坐上开往右边的火车

3.状态转移方程:dp[i][j] = min(dp[i+1][j]+1,dp[i+t[j]][j+1],dp[i+t[j-1]][j-1])

我们可以做一个乘车时刻表来记录i时刻j车站是否有车经过。

dp[time][N] = 0,其余初始化为正无穷。

同时,可以看出,时刻i一直在往大的方向转移,所以,i的循环应该是逆序。

还有,按道理来说这个人不一定只在该车站仅仅等待1个单位时间,应该可以等待k个,然而在更新dp[i+1][j]时(由于是逆序循环,所以dp[i+1][j]先被考虑)也考虑了等待的问题,所以只需要考虑当前时刻的这1单位时刻等待与否,之前的k-1个单位时刻其实已经考虑过了。

贴AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define maxn1 55
#define maxn2 255
#define F 0x3f
#define INF 0x3f3f3f3f
using namespace std;
int timetable[][maxn2][maxn1];
int t[maxn1],dp[maxn2][maxn1];
int main()
{
int N,cas = ;
while(scanf("%d",&N) == && N){
int time;
scanf("%d",&time);
for(int i = ;i < N;++i) scanf("%d",&t[i]);
memset(timetable,,sizeof(timetable));
memset(dp,F,sizeof(dp));
int M1,M2,train;
scanf("%d",&M1);
for(int i = ;i < M1;++i){
scanf("%d",&train);
int sum = train;
for(int j = ,k = ;j < N && k <= N;sum += t[j],++j,++k){
if(sum > time) break;
timetable[][sum][k] = ;
}
}
scanf("%d",&M2);
for(int i = ;i < M2;++i){
scanf("%d",&train);
int sum = train;
for(int j = N - ,k = N;j >= && k >= ;sum += t[j],--j,--k){
if(sum > time) break;
timetable[][sum][k] = ;
}
}
dp[time][N] = ;
for(int i = time - ;i >= ;--i){
for(int j = ;j <= N;++j){
dp[i][j] = dp[i + ][j] + ;
if(timetable[][i][j] && j < N && i + t[j] <= time)
dp[i][j] = min(dp[i][j],dp[i + t[j]][j + ]);
if(timetable[][i][j] && j > && i + t[j - ] <= time)
dp[i][j] = min(dp[i][j],dp[i + t[j - ]][j - ]);
}
}
if(dp[][] >= INF) printf("Case Number %d: impossible\n",cas++);
else printf("Case Number %d: %d\n",cas++,dp[][]);
}
return ;
}

UVa1025 (DAG上的dp)的更多相关文章

  1. UVA - 10131Is Bigger Smarter?(DAG上的DP)

    题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...

  2. BZOJ 3998 TJOI2015 弦论 后缀自动机+DAG上的dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3998 题意概述:对于一个给定长度为N的字符串,求它的第K小子串是什么,T为0则表示不同位置 ...

  3. NYOJ16 矩形嵌套 【DAG上的DP/LIS】

    矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c ...

  4. DAG上的DP

    引例:NYOJ16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可 ...

  5. UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)

    用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...

  6. BZOJ 4011 HNOI2015 落忆枫音 DAG上的dp(实际上重点在于分析)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题意概述:给出一张N点的DAG(从1可以到达所有的点),点1的入度为0.现在加一条原 ...

  7. UVA 11324 The Largest Clique(缩点+DAG上的dp)

    求最大团.和等价性证明有类似之处,只不过这个不是求互推,而是只要a->b,或b->a即可. 同样的,容易想到先缩点,得到DAG,每个节点上保存SCC的点数,相信任意一条由根节点(入度为零) ...

  8. Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )

    题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是  a ...

  9. (板子)缩点 + DAG上的DP(深搜)luogu P3387

    板子传送门 根据题目意思,我们只需要找出一条点权最大的路径就行了,不限制点的个数.那么考虑对于一个环上的点被选择了,一整条环是不是应该都被选择,这一定很优,能选干嘛不选.很关键的是题目还允许我们重复经 ...

随机推荐

  1. Lvs+keepalived+mysql主从热备

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  2. 性能测试培训: 监控CPU之python

    性能测试培训: 监控CPU之python 作为一名测试开发工程师,开发脚本是为了测试服务的,我们在手里没有性能监控工具的情况下,我们会自己来进行开发脚本完成监控任务.下面是python监控cpu '' ...

  3. 手机自动化测试:Appium代码之Logger

    手机自动化测试:Appium代码之Logger   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自动化测 ...

  4. Mac 自定义sublime在浏览器中打开的快捷键/win系统理论通用

    安装"view in browser"官方版的说明:(前提是得先安装package control插件) 1.通过"ctrl+shift+p"打开命令面板 2. ...

  5. MyBatis 源码分析——动态SQL语句

    有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...

  6. Struts2基础学习(一)—初识Struts2

      目录 一.什么是Struts2 二.搭建Struts2的开发环境 三.Struts2的配置文件 四.MVC模式 一.什么是Struts2      Struts2是一个非常优秀的MVC框架,由传统 ...

  7. Ubuntu抛弃了Untiy转向Gnome,美化之路怎么办?不用怕咱一步一步大变身!

    跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 常用软件安装+系统软件卸载:http://www.cnblogs.com/du ...

  8. Android5.0水波纹效果ripple实现

    1.如何设置波纹效果 // 波纹有边界 android:background="?android:attr/selectableItemBackground" // 波纹超出边界 ...

  9. C# CodeFirst编程模型一

    定义实体类型: 定义两个实体Menu和MenuCard,一个menu关联一个menucard,menucard包含对所有menu的引用. public class Menu { public int ...

  10. stm32串口通讯问题

    stm32串口通讯问题 在串口试验中,串口通讯不正常,则可能会出现以下问题: 1. 配置完成后,串口没有任何消息打印. 原因:1,端口配置有问题,需要重新检查I/O口的配置 2,接线有问题,检查接线是 ...