UVA 1025 A Spy in the Metro [动态规划] [DAGdp]
2016-08-20 23:25
411 查看
A Spy in the Metro
Time Limit: 3000MS 64bit IO Format: %lld & %llu
![](https://img-blog.csdn.net/20160820232144072)
![](https://img-blog.csdn.net/20160820232150618)
![](https://img-blog.csdn.net/20160820232154962)
抓住时间这个天然的顺序。
每一个状态(i,j) i时间在j站台,有三种转移方案
在原地停留1s
从左边的车站来
从右边的车站来
那么方程就很好写了。。
这个DAG有些特殊。。。
Time Limit: 3000MS 64bit IO Format: %lld & %llu
抓住时间这个天然的顺序。
每一个状态(i,j) i时间在j站台,有三种转移方案
在原地停留1s
从左边的车站来
从右边的车站来
那么方程就很好写了。。
这个DAG有些特殊。。。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<vector> #include<queue> #include<stack> #include<map> #include<set> #include<string> #include<iomanip> #include<ctime> #include<climits> #include<cctype> #include<algorithm> #ifdef WIN32 #define AUTO "%I64d" #else #define AUTO "%lld" #endif using namespace std; #define smax(x,tmp) x=max((x),(tmp)) #define smin(x,tmp) x=min((x),(tmp)) #define maxx(x1,x2,x3) max(max(x1,x2),x3) #define minn(x1,x2,x3) min(min(x1,x2),x3) const int INF=0x3f3f3f3f; const int maxn = 55; const int maxt = 205; int n,T; int sum[maxn]; int M1,M2; bool train[maxt][maxn][2]; // 0 is started from the left int dp[maxt][maxn]; inline bool init() { if(!~scanf("%d%d",&n,&T) || !n) return false; memset(sum,0,sizeof(sum)); memset(train,0,sizeof(train)); for(int i=1;i<n;i++) { int tmp; scanf("%d",&tmp); sum[i+1]=sum[i]+tmp; } scanf("%d",&M1); for(int i=1;i<=M1;i++) { int tmp; scanf("%d",&tmp); for(int j=1;j<=n;j++) if(sum[j]+tmp<=T) train[sum[j]+tmp][j][0]=true; } scanf("%d",&M2); for(int i=1;i<=M2;i++) { int tmp; scanf("%d",&tmp); for(int j=n;j>=1;j--) if(sum -sum[j]+tmp<=T) train[sum -sum[j]+tmp][j][1]=true; } return true; } int dynamic() { memset(dp,0x3f,sizeof(dp)); dp[0][1]=0; for(int i=1;i<=T;i++) for(int j=1;j<=n;j++) { dp[i][j]=dp[i-1][j]+1; if(j>1 && i-(sum[j]-sum[j-1])>=0 && train[i-(sum[j]-sum[j-1])][j-1][0]) smin(dp[i][j],dp[i-(sum[j]-sum[j-1])][j-1]); if(j<n && i-(sum[j+1]-sum[j])>=0 && train[i-(sum[j+1]-sum[j])][j+1][1]) smin(dp[i][j],dp[i-(sum[j+1]-sum[j])][j+1]); } return dp[T] ; } int main() { #ifndef ONLINE_JUDGE freopen("spy.in","r",stdin); freopen("spy.out","w",stdout); #endif int cas=0; while(init()) { int ans = dynamic(); if(ans<INF) printf("Case Number %d: %d\n",++cas,ans); else printf("Case Number %d: impossible\n",++cas); } return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- Changing DAG & DAG members IP addresses
- Exchange 2010之数据中心切换
- 动态规划解决背包问题的核心思路
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 自顶向下动态规划解决最长公共子序列(LCS)问题
- 01背包问题
- 初学图论-DAG单源最短路径算法
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **