*/ ios
//解答代碼,這是看一個教程書抄的,以爲不錯就拿來分享一下 spa
/* 文件名稱: 遊船費問題 建立日期: 2013/3/29 */ /* 動態規劃 */ #include <iostream> using namespace std; const int MAX = 100; int n, r[MAX][MAX], money[MAX][MAX]; void moneyDP(int rr[MAX][MAX], int mm[MAX][MAX], int nn); void show(const int rr[MAX][MAX]); int main() { int i = 0, j = 0, num = 0, a = 0; while (cin >> n) { if (n == 0) break; else { num++; for (i = 0; i < n; i++) for (j = i + 1; j <= n; j++) { cin >> a; r[i][j] = a; } moneyDP(r, money, n); cout << "case" << num << ":\t"; cout << money[0][n] << endl; }show (money); } return 0; } void moneyDP(int rr[MAX][MAX], int mm[MAX][MAX], int nn) { int i = 0, j = 0, num = 0, temp = 0, t = 0; for (i = 0; i < nn; i++) for (j = i + 1; j <= nn; j++) {//賦初值 mm[i][j] = rr[i][j]; } for (i = 0; i <= nn; i++) mm[i][i] = 0; show(rr); for (t = 2; t <= nn; t++) for (i = 0; i <= nn - t; i++) { temp = rr[i][i + t]; for (j = i + 1; j < i + t; j++) { if (temp > mm[i][j] + mm[j][i + t]) temp = mm[i][j] + mm[j][i + t]; mm[i][i + t] = temp; } } return ; } void show(const int rr[MAX][MAX]) { int i = 0, j = 0; for (i = 0; i < n; i++) { for (j = i + 1; j <= n; j++) {//賦初值 cout << "(" << i << "," << j << ") = "<< rr[i][j] << "\t"; } cout << endl; } }