Mobile Service 題解報告

2022-04-28 20:48:19 字數 1282 閱讀 4570

題目傳送門

【題目大意】

有l個位置(編號為1~l)和n個要求,初始狀態三個服務員分別在1,2,3號位置,每個要求給出乙個位置p[i],需要乙個服務員到這個位置去,已知從位置i到位置j的費用為c[i][j],求最小費用。

【思路分析】

我們用f[i][x][y][z]表示完成了前i個要求,三個服務員分別在x,y,z位置的最小費用。然後我們發現,其中乙個服務員必定是在第i個要求的位置的,即z=p[i],那麼有一維陣列可以去掉。

接下來看一下轉移方程,對於第i+1個要求有三種情況,即讓p[i],x,y位置的服務員的其中乙個去到位置p[i+1],由此可得:

$if(x!=p[i+1]且y!=p[i+1])  f[i+1][x][y]=min(f[i+1][x][y],f[i][x][y]+c[p[i]][p[i+1]])$

$if(p[i]!=p[i+1]且y!=p[i+1])  f[i+1][p[i]][y]=min(f[i+1][p[i]][y],f[i][x][y]+c[x][p[i+1]])$

$if(x!=p[i+1]且p[i]!=p[i+1])  f[i+1][x][p[i]]=min(f[i+1][x][p[i]],f[i][x][y]+c[y][p[i+1]])$

通過觀察轉移方程我們發現,每乙個狀態只與其前乙個狀態有關,所以可以用滾動陣列防止爆空間,這一點詳見**。

【**實現】

1 #include2 #include3 #include4

#define rg register

5#define go(i,a,b) for(rg int i=a;i<=b;i++)

6using

namespace

std;

7int t,l,n,c[202][202],p[1002];8

int f[2][202][202];9

intans,a;

10const

int maxn=1e9+7;11

intmain()31}

32 go(i,1,l) go(j,1

,l)33

if(i!=j&&i!=p[n]&&j!=p[n])

34 ans=min(ans,f[a][i][j]);

35 printf("

%d\n

",ans);36}

37return0;

38 }

**戳這裡

沒有題解的題解

考試要寫題解,可我不會寫,然後就變成了沒有題解的題解了 frist.評價 這是一道只考讀入的題。題面 n m的方陣,輸出被 包圍的 0 的個數。做法 讀入 本題難點 然後做一遍遍歷,將在方陣邊緣的0全部做一遍dfs遍歷將與其連成一塊的 0 全部變成 然後數一遍有幾個 0 就可以了。還在完善中,只能給...

題解 LibreOJ 6229 題解

題目鏈結 給定 n 求 f n sum n sum i frac i,j bmod 10 9 7 1 le n le 10 9 首先,這個求和範圍有些不爽,利用對稱性轉化一下得 f n frac 12 left n sum n sum n frac i,j right 然後推一下式子 begin s...

題解 CF1119H Tripe題解

題目傳送門 給出 n,t,x,y,z 值域 le 2 t 給出 n 個三元組 a i,b i,c i 表示有 x 個 a i y 個 b i z 個 c i 對於每個 k in 0,2 t 1 求出從每組選出乙個數的異或值為 k 的方案數。先定義 delta n f delta 表示多項式 f 的第...