博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 1025,城市的间谍
阅读量:4709 次
发布时间:2019-06-10

本文共 1927 字,大约阅读时间需要 6 分钟。

题目链接:

 

题意:

地铁是线性的,有n个站,编号(1~n),M1辆从左至右的车,和M2辆从右至左的车,发车时刻给出,然后是,每两个站之间要跑多长时间。一个间谍要从1车站到n车站,但是他要求等车的时间最短,不然间谍会被抓,有可能到不了,输出impossible.

 

分析:

影响每一步的决策只有两个因素,1,时刻,2,哪一个车站。那么DP状态就出来了DP[T][n]在T时刻,第n个站还要等多少分钟。

状态转移:只有三个情况,要么是等一分钟,要么是上左边的车,要么是上右边的车。

 

边界条件dp[T][n] = 0;不用等了。

dp[i][j] = min(dp[i+1][j]+1,dp[i+t[j]][j+1],dp[i+t[j-1]][j-1]);

 

然后就是求has_train[][][2]数组了。具体看程序。

 

#include 
using namespace std;#define INF 0x3f3f3f3fint n;int T;int t[55];int has_train[205][55][2];int dp[205][55];int main(){ int cases = 1; while(scanf("%d",&n),n) { scanf("%d",&T); for(int i=1; i<=n-1; i++) { scanf("%d",&t[i]); } int m1,m2; scanf("%d",&m1); memset(has_train,0,sizeof(has_train)); while(m1--) { int d; scanf("%d",&d); for(int j=1; j<=n-1; j++) { if(d<=T) has_train[d][j][0] = 1; d+=t[j]; } } scanf("%d",&m2); while(m2--) { int d; scanf("%d",&d); for(int j=n-1;j>=1;j--) { if(d<=T) has_train[d][j+1][1] = 1; d+=t[j]; } } for(int i=1; i<=n-1; i++) dp[T][i] = INF; dp[T][n] = 0; for(int i = T-1; i>=0; i--) { for(int j=1; j<=n; j++) { dp[i][j] = dp[i+1][j] + 1; if(j
<=T) { dp[i][j] = min(dp[i][j],dp[i+t[j]][j+1]); } if(j>1&&has_train[i][j][1]&&i+t[j-1]<=T) { dp[i][j] = min(dp[i][j],dp[i+t[j-1]][j-1]); } } } printf("Case Number %d: ",cases++); if(dp[0][1]>=INF) printf("impossible\n"); else printf("%d\n",dp[0][1]); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/5977595.html

你可能感兴趣的文章
Java基础知识总结(三)
查看>>
windows 下配置ndk环境,无需cygwin
查看>>
flash基本操作
查看>>
工厂模式
查看>>
ctags 寻找方法定义处
查看>>
Laravel 5.2 教程 - 邮件
查看>>
SQL server 数据库——数学函数、字符串函数、转换函数、时间日期函数
查看>>
[再寄小读者之数学篇](2014-11-14 矩阵的应用: 有限几何)
查看>>
[Everyday Mathematics]20150218
查看>>
单链表的翻转,插入,删除,遍历操作
查看>>
Helm介绍
查看>>
重提基数排序
查看>>
【开源项目】扫雷
查看>>
关于三种主流WEB架构的思考
查看>>
学习进度表
查看>>
【软件工程】代码复审与子数组最大和线性算法寻找问题
查看>>
JSON详解
查看>>
GDI+ 双缓冲实现
查看>>
xcache
查看>>
Java8 lambda表达式10个示例
查看>>