[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
30 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 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...