题目链接:UVA - 1025 A Spy in the Metro
#include <bits/stdc++.h>
using namespace std;
int s[55][55], a[12500][55][5], dp[255][55];
int n, T, M1, M2, i, j, k, ans, num = 1;
void init()
{
memset(s, 0, sizeof(s));
memset(a, 0, sizeof(a));
for(i = 0; i <= T; i++)
{
for(j = 0; j <= n; j++)dp[i][j] = 0x3f3f3f;
}
ans = 0x3f3f3f;
return ;
}
void build()
{
for(i = 1; i <= n - 1; i++)
{
cin >> k;
s[i][i + 1] = s[i + 1][i] = k;
//s[n - i + 1][n - i] = k;
}
cin >> M1;
for(i = 1; i <= M1; i++)
{
cin >> k;
for(j = 1; j <= n - 1; j++)
{
a[k][j][1] = 1;
k += s[j][j + 1];
}
}
cin >> M2;
for(i = 1; i <= M2; i++)
{
cin >> k;
for(j = n; j > 1; j--)
{
a[k][j][2] = 1;
k += s[j][j - 1];
}
}
return ;
}
void slove()
{
dp[0][1] = 0;
for(i = 1; i <= T; i++)
{
for(j = 1; j <= n; j++)
{
int& q = dp[i][j];
q = dp[i - 1][j] + 1;
if(j > 1 && i - s[j][j - 1] >= 0 && a[i - s[j][j - 1]][j - 1][1] == 1)
q = min(q, dp[i - s[j][j - 1]][j - 1]);
if(j < n && i - s[j][j + 1] >= 0 && a[i - s[j][j + 1]][j + 1][2] == 1)
q = min(q, dp[i - s[j][j + 1]][j + 1]);
}
}
cout << "Case Number "<< num++ << ": " ;
if(dp[T][n] >= 0x3f3f3f)cout << "impossible" << endl;
else cout << dp[T][n] << endl;
}
int main()
{
std::ios::sync_with_stdio(0);
while(cin >> n)
{
if(n == 0)break;
cin >> T;
init();
build();
slove();
}
return 0;
}