博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva1025 动态规划
阅读量:4945 次
发布时间:2019-06-11

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

这道题的边界是dp(T,N)=0,状态dp(i,j)表示在时间i、第j个车站最少等待时间,有三个决策:1、等1分钟 2、如果有向左的车,向左 3、若果有向右的车,向右  转移方程就是dp(i,j)=min(dp(i+1,j),dp(i+t[j],j+1),dp(i+t[j-1],j-1))

AC代码:

#include
#include
#include
using namespace std;const int INF=1<<30;const int maxn=200+5;int dp[maxn][55];int time[55],t[55];int has[12600][55][2]; //has trainint main(){ int N,T,M1,M2; int kase=0; while(scanf("%d",&N)==1&&N){ scanf("%d",&T); time[1]=0; for(int i=2;i<=N;++i){ scanf("%d",&t[i]); time[i]=time[i-1]+t[i]; } memset(has,0,sizeof(has)); scanf("%d",&M1); for(int i=1;i<=M1;++i){ //right int r; scanf("%d",&r); for(int j=1;j<=N;++j){ has[r+time[j]][j][0]=1; } } scanf("%d",&M2); for(int i=1;i<=M2;++i){ int l; scanf("%d",&l); for(int j=N;j>=1;--j){ has[l+time[N]-time[j]][j][1]=1; } } for(int i=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+1]][j+1]); if(j>1&&has[i][j][1]&&i+t[j]<=T) dp[i][j]=min(dp[i][j],dp[i+t[j]][j-1]); } printf("Case Number %d: ",++kase); if(dp[0][1]>=INF) printf("impossible\n"); else printf("%d\n",dp[0][1]); } return 0;}
若有不当之处欢迎指出!

转载于:https://www.cnblogs.com/flyawayl/p/8305559.html

你可能感兴趣的文章
[leetcode]250. Count Univalue Subtrees统计节点值相同的子树
查看>>
理解Backtracking
查看>>
使用Jsoup 抓取页面的数据
查看>>
C#获取URL参数值
查看>>
Struts 框架 之 文件上传下载案例
查看>>
【重走Android之路】【路线篇(二)】知识点归纳
查看>>
graphviz入门
查看>>
CSS可以和不可以继承的属性
查看>>
Python基础(三)
查看>>
Continuous integration
查看>>
hl7 V2中Message Control ID的含义及应用
查看>>
IOS 4个容易混淆的属性(textAligment contentVerticalAlignment contentHorizontalAlignment contentMode)...
查看>>
C#HttpHelper类1.3正式版教程与升级报告
查看>>
Quartz和TopShelf Windows服务作业调度
查看>>
让ie9之前的版本支持canvas
查看>>
排序规则
查看>>
percent的用法
查看>>
Hibernate三种状态详解
查看>>
判断一个数是否是2^N次方
查看>>
js中几种实用的跨域方法原理详解
查看>>