狀壓dp 送餐員

2022-05-03 16:33:07 字數 1669 閱讀 6792

[odevs2800]送餐員

題目描述 description

有乙個送外賣的,他手上有n份訂單,他要把n份東西,分別送達n個不同的客戶的手上。n個不同的客戶分別在1~n個編號的城市中。送外賣的從0號城市出發,然後n個城市都要走一次(乙個城市可以走多次),最後還要回到0點(他的單位),請問最短時間是多少。現在已知任意兩個城市的直接通路的時間。

輸入描述 input description

第一行乙個正整數n (1<=n<=15)

接下來是乙個(n+1)*(n+1)的矩陣,矩陣中的數均為不超過10000的正整數。矩陣的i行j列表示第i-1號城市和j-1號城市之間直接通路的時間。當然城市a到城市b的直接通路時間和城市b到城市a的直接通路時間不一定相同,也就是說道路都是單向的。

輸出描述 output description

乙個正整數表示最少花費的時間

樣例輸入 sample input

3

0 1 10 10

1 0 1 2

10 1 0 10

10 2 10 0

樣例輸出 sample output

資料範圍及提示 data size & hint

1<=n<=15

試題分析:額,這題資料有bug,n=15,資料輸入了乙個15*15的矩陣而不是16*16的……

我們設dp[i][j]表示現在走到了i,當前狀態為j的最小值

那麼就有dp方程:

dp[j][i]=min(dp[j][i],dp[k][i-(1<注意判一下j是否在集合i中

**

#include#include#include#include#include#include#include//#includeusing namespace std;

const int inf = 9999999;

#define ll long long

inline int read()

int n,m;

int dp[17][131073];

int dis[18][18];

int main()

for(int k=0;k<=n;k++)//floyd先跑一遍

for(int i=0;i<=n;i++)

for(int j=0;j<=n;j++)

dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

memset(dp,inf,sizeof(dp));

dp[0][0]=0;

for(int i=0;i<(1<<(n+1));i++)

dp[j][i]=min(dp[j][i],dp[k][i-(1

}} printf("%d\n",dp[0][(1<<(n+1))-1]);

return 0;

}

送外賣 狀壓DP

題目描述 description 有乙個送外賣的,他手上有n 份訂單,他要把 n份東西,分別送達 n個不同的客戶的手上。n個不同的客戶分別在 1 n個編號的城市中。送外賣的從 0號城市出發,然後 n個城市都要走一次 乙個城市可以走多次 最後還要回到 0點 他的單位 請問最短時間是多少。現在已知任意兩...

Codevs 2800 送外賣 狀壓DP

2800 送外賣 時間限制 2 s 空間限制 256000 kb 題目等級 鑽石 diamond 題目描述 description 有乙個送外賣的,他手上有n份訂單,他要把n份東西,分別送達n個不同的客戶的手上。n個不同的客戶分別在1 n個編號的城市中。送外賣的從0號城市出發,然後n個城市都要走一次...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...