題意:
給定n個城市,n*(n-1)個航線,求在確定的第k天從城市1飛到城市n的最小票價,途中可以經過任意航班可以達到的城市。
這個題的輸入是醬的:第一行輸入n,k,表示n個城市和確定的k天,然後以下n*(n-1)行,每行先輸入當前航班票價迴圈的天數d,然後依此給出d天票價。
航班的可達關係是:eg,n = 2,第一行代表城市1到2的航班,第2行表示城市2到1的航班...。
具體輸入看**。
解析:dp[ d ][ i ] 表示d天到達城市i的最小花費,price[ j ][ i ] [ d ] 表示在第d天從城市j到達城市i的費用。
迴圈的票價用 t = (d - 1) % day[j][i] + 1 來處理。
臨界值dp[ 0 ] [ 1 ] = 0 , 餘下 = inf。
狀態轉移方程:dp[ d ] [ i ] = min ( dp[ d ] [ i ] , dp[d - 1] [ j ] + price[ j ] [ i ] [ t ] ).
對於當前天數d,從j地點到達i地點,若前一天從j飛到i的**小於當前,則更新。
答案為d[k][n]。
**:
#include #include #include #include #include #include #include #include #include #include #define ll long long
using namespace std;
const int maxn = 10 + 10;
const int maxk = 1000 + 10;
const int inf = 0x3f3f3f3f;
int day[maxk][maxk];
int dp[maxk][maxn];// k days to destination n
int price[maxn][maxn][maxk];
int main()}}
}memset(dp, inf, sizeof(dp));
dp[0][1] = 0;
for (int d = 1; d <= k; d++)}}
}}
printf("scenario #%d\n", ca++);
if (dp[k][n] != inf)
printf("the best flight costs %d.\n\n", dp[k][n]);
else
printf("no flight possible.\n\n");
}return 0;
}
UVA 12657 移動盒子 最詳細講解
題目鏈結 有一行從左到右編號為 1,2 3,4 n 的盒子,定義以下四種指令 1 x y 將編號為x 的盒子移動到 y 的左邊 若x已在 y 的左邊,則忽略此指令 2 x y 將編號為 x 的盒子移動到 y 的右邊 若x 已在y的右邊,則忽略此指令 3 x y 交換 x 和 y 盒子的位置 4 將所...
UVA714給出n個數分成m個部分,使和最大的最小
這題,小白書上有講,所以當時也沒多想直接二分,分完之後,發現有問題,他說前面的盡量小,這裡就要貪心,從後面貪心,只要和值不大於二分的值就一直二分,然後發現還是不對,看了別人的,忽略了乙個問題,二分的時候 x的初始值不能是零,因為我寫的判斷二分的函式比較特殊,所以如果判斷的值小於全部的數也能過,所以,...