https://vjudge.net/problem/UVA-1025
看见spy忍俊不禁的想起省赛时不知道spy啥意思 ( >_<
f[i][j]表示i时刻处于j站所需的最少等待时间,有三种可能,一是i-1时刻就在这里然后等待了1时刻 f[i][j]=f[i-1][j]+1 ; 二是正好由由左边相邻的一个车站开过来(如果可以的话) f[i][j]=f[i-t[j-1]][j-1]; 三是正好由右边的车站开过来(if can) f[i][j]=f[i-t[j]][j+1]; 取三者的最小值就好,最后如果f[T][N]>=inf表示impossible.
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 int t[55],tl[55],tr[55]; 5 int f[255][55]; 6 bool can[255][55][2]; 7 int main() 8 { 9 int N,T,M1,M2,i,j,k=0; 10 while(cin>>N&&N){ 11 cin>>T; 12 for(i=1;i<N;++i) scanf("%d",t+i); 13 memset(f,inf,sizeof(f)); 14 memset(can,0,sizeof(can)); 15 cin>>M1; 16 for(i=1;i<=M1;++i) 17 { 18 int s; 19 scanf("%d",tl+i); 20 for(j=1,s=tl[i];j<=N&&s<=T;s+=t[j++]) 21 { 22 can[s][j][0]=1; 23 } 24 } 25 cin>>M2; 26 for(i=1;i<=M2;++i) 27 { 28 int s; 29 scanf("%d",tr+i); 30 for(j=N,s=tr[i];j>=1&&s<=T;s+=t[j-1],j--) 31 can[s][j][1]=1; 32 } 33 f[0][1]=0; 34 for(i=1;i<=T;++i) 35 { 36 for(j=1;j<=N;++j) 37 { 38 f[i][j]=f[i-1][j]+1; 39 if(j>1&&i-t[j-1]>=0&&can[i-t[j-1]][j-1][0]) 40 f[i][j]=min(f[i][j],f[i-t[j-1]][j-1]); 41 if(j<N&&i-t[j]>=0&&can[i-t[j]][j+1][1]) 42 f[i][j]=min(f[i][j],f[i-t[j]][j+1]); 43 } 44 } 45 printf("Case Number %d: ",++k); 46 if(f[T][N]>=inf) puts("impossible"); 47 else cout<<f[T][N]<<endl; 48 } 49 return 0; 50 } 51 /* 52 4 53 55 54 5 10 15 55 4 56 0 5 10 20 57 4 58 0 5 10 15 59 60 ans=5 61 */