uva 1025 A Spy in the Metro dp状态转移

来源:互联网 发布:js中单双引号 编辑:程序博客网 时间:2024/05/29 04:52
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <stack>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <vector>#include <cstring>#define INF 100000000using namespace std;int n,T,m1,m2;int t[100];int A1[100];int A2[100];int B1[100][100];int B2[100][100];int dp[300][100];int find(int key,int *a,int len){int ma = -1;for(int i = 0;i < len;i++){if(a[i] <= key && a[i] > ma){ma = a[i];}}return ma;}int main(){int q = 1;while(cin >> n,n){scanf("%d",&T);for(int i = 1;i < n;i++){scanf("%d",&t[i]);}scanf("%d",&m1);for(int i = 0;i < m1;i++){scanf("%d",&A1[i]);B1[1][i] = A1[i]; }scanf("%d",&m2);for(int i = 0;i < m2;i++){scanf("%d",&A2[i]); B2[n][i] = A2[i];}for(int i = 2 ;i <= n;i++){for(int j = 0;j < m1;j++){B1[i][j] = B1[i-1][j] + t[i-1];}}for(int i = n-1;i >= 1;i--){for(int j = 0;j < m2;j++){B2[i][j] = B2[i+1][j] + t[i];}}for(int i = 0;i <= T;i ++){for(int j = 0;j <= n;j++ ){dp[i][j] = INF; }}//dp[i][j]的意思是第i时刻到达j站点的最小时间,只有三种状态能到达该状态//1 原先就在这个位置然后再多等了1分钟 ,dp[i][j] = dp[i-1][j] //2 从他前一个站点到达然后开始等待,dp[i][j] = dp[x-t[j-1]][j-1] + i - x; //3 从他后一个站点到达然后才开始等待,dp[i][j] = dp[y-t[j]][j+1] + i - y;//取这三种之间最小的那个就是这个最小的时间了 dp[0][1] = 0;for(int i = 1;i <= T;i++){for(int j = 1;j <= n;j++){int  a,c,d;a = dp[i-1][j] + 1;int x = find(i,B1[j],m1);int y = find(i,B2[j],m2);if(x < 0){c = INF;}else{if((j-1)> 0)c = dp[x-t[j-1]][j-1]+i-x;elsec = INF;}if(y<0){d = INF;}else{if((j+1) <= n)d = dp[y-t[j]][j+1]+i-y;elsed = INF;}dp[i][j] = min(a,min(c,d));}}if(dp[T][n] != INF)printf("Case Number %d: %d\n",q++,dp[T][n]);elseprintf("Case Number %d: impossible\n",q++);}return 0;}

0 0
原创粉丝点击