这是紫书上的第一个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. 【webpack学习笔记(一)】流行的前端模块化工具webpack初探

    从开发文件到生产文件   有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开发的效率.可是 ...

  2. C#调用webbrowser,阻止弹出新HTML页面

    参考资料: 1.C#调用webbrowser,阻止弹出新IE窗口 http://www.cnblogs.com/blindman/p/3819649.html 2.[WPF]监听WPF的WebBrow ...

  3. 使用关系型数据库作为Redis落地的思路

    Redis的持久化方式主要有2种:RDB和AOF,但各有不足,同时Redis没有SQL支持,Redis本身提供的命令不足以实现大多数SQL查询需求,对后期运营的分析需求支撑不足.此外,对于游戏来说,活 ...

  4. Framework7初始化

    /** * Framework7初始化 * 需引用jQuery */ /*---------------------------函数---------------------------*/ /** ...

  5. JAVA加密算法系列-AesEBC

    package ***; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java. ...

  6. Win10《芒果TV》商店版更新v3.4.0:率先支持创意者画中画,工作娱乐两不误

    在Win10创新者更新中,微软为Windows10 PC系统添加了UWP应用窗口置顶功能(亦称画中画功能),Win10版<芒果TV>更新v3.4.0,率先宣布支持画中画新特性,为广大用户带 ...

  7. 一个web应用的诞生(11)--列表分页

    上章的结束,若在实际开发过程中,会发现一个问题,那就首页或关注分享,是一下子按时间顺序全部显示出来,这在实际项目中不可能出现的,想想实际中的产品是如何做的? 一般来说,无非是两种,一种是使用页码,来进 ...

  8. Mybatis(四) 高级映射,一对一,一对多,多对多映射

    天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...

  9. 5 安装Alloc服务

    cnblogs-DOC 1.服务器环境 2.安装Redis3.安装Zookeeper4.安装MPush5.安装Alloc服务6.完整测试7.常见问题 一.Linux安装Mpush-Alloc [roo ...

  10. 文本处理sed常用操作

    文本处理sed常用操作 linux sed (stream editor) is a Unix utility that parses and transforms text, using a sim ...