uva 590 最優決策(DP)

2021-06-29 03:33:30 字數 1286 閱讀 3166

題意:

給定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的初始值不能是零,因為我寫的判斷二分的函式比較特殊,所以如果判斷的值小於全部的數也能過,所以,...