迭代实现
#include<cstdio>
#include<iostream>#include<cstring>
#include<algorithm>
#include<vector>
#define min2(a,b) a<b?a:b
using namespace std;
const int INF=99999999;
int N,T;
int g[100][100];
int v1[300][60],v2[300][60];
int dp[300][60];
void dp1(int t,int st){
if(t>T||st>N||st<1)return;
for(int tt=t;tt<=T;tt++){
if(dp[tt][st]==-1||dp[tt][st]>dp[t][st]+tt-t){
dp[tt][st]=dp[t][st]+tt-t;
if(tt!=t)dp1(tt,st);
}
if(v1[tt][st]){
if(dp[tt+g[st][st+1]][st+1]==-1||dp[tt+g[st][st+1]][st+1]>dp[t][st]+tt-t){
dp[tt+g[st][st+1]][st+1]=dp[t][st]+tt-t;
dp1(tt+g[st][st+1],st+1);
}
}
if(v2[tt][st]){
if(dp[tt+g[st][st-1]][st-1]==-1||dp[tt+g[st][st-1]][st-1]>dp[t][st]+tt-t){
dp[tt+g[st][st-1]][st-1]=dp[t][st]+tt-t;
dp1(tt+g[st][st-1],st-1);
}
}
}
}int main(){
int cnt=1;
while(cin>>N&&N){
cin>>T;
memset(g,0,sizeof(g));
for(int i=1;i<=N-1;i++){int t;cin>>t;g[i][i+1]=t;g[i+1][i]=t;}
memset(v1,0,sizeof(v1));
int M1;
cin>>M1;
for(int i=1;i<=M1;i++){
int d;
cin>>d;
for(int t=d,st=1;t<=T&&st<=N;t+=g[st][st+1],st++)v1[t][st]=1;
}
memset(v2,0,sizeof(v2));
int M2;
cin>>M2;
for(int i=1;i<=M2;i++){
int e;
cin>>e;
for(int t=e,st=N;t<=T&&st>=1;t+=g[st][st-1],st--)v2[t][st]=1;
}
memset(dp,-1,sizeof(dp));
dp[0][1]=0;
dp1(0,1);
cout<<"Case Number "<<cnt++<<": ";
if(dp[T][N]!=-1)cout<<dp[T][N]<<endl;
else cout<<"impossible"<<endl;
}
return 0;}