动态规划题,本题与 HDU 1474 完全相同。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 15;
const int MAXK = 1005;
const int MAXD = 35;
const int INF = 0x3f3f3f3f;
int dp[MAXN][MAXK]; //dp[i][j]表示从城市1到城市i,乘坐j次飞机,最小花费
int day[MAXN][MAXN]; //day[i][j]表示从城市i到城市j,飞机循环的天数
int price[MAXN][MAXN][MAXD]; //price[i][j][k]表示从城市i到城市j,第k天的机票价格
int main()
{
int Case = 1; //测试用例数
int n, k;
while (cin >> n >> k)
{
if (n == 0 && k == 0)
break;
for (int i = 1; i <= n; i++) //输入
{
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
cin >> day[i][j];
for (int m = 1; m <= day[i][j]; m++)
cin >> price[i][j][m];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= k; j++)
dp[i][j] = INF;
}
dp[1][0] = 0;
for (int m = 1; m <= k; m++) //动态规划
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)
continue;
int d = (m - 1) % day[i][j] + 1; //天数
if (price[i][j][d] != 0 && dp[i][m - 1] != INF)
dp[j][m] = min(dp[j][m], dp[i][m - 1] + price[i][j][d]);
}
}
}
cout << "Scenario #" << Case++ << endl;
if (dp[n][k] == INF)
cout << "No flight possible." << endl << endl;
else
cout << "The best flight costs " << dp[n][k] << "." << endl << endl;
}
return 0;
}
继续加油。