loj3302 訊號傳遞

2022-06-07 12:06:12 字數 998 閱讀 4590

由於n較大,可以將n個數中的關係對數量記錄在$m*m$的矩陣中,記作$a[i][j]$

考慮樸素的狀壓dp列舉排列,即$f[i]$表示以i中的數的一種排列為整個序列的字首的最小代價,然後轉移列舉下乙個數j以及與其相關的數k,那麼有轉移$f[i|j]=\min(f[i]+(|i|+1)(\sum_\limits (t\cdot a[j][k]+a[k][j])+\sum_\limits (t\cdot a[k][j]-a[j][k])))$,時間複雜度為$o(m^\cdot 2^)$

對時間優化,對於乙個i,需要快速求出下乙個數為j時$|i|+1$的係數,設為$g[i][j]$,考慮從$i-lowbit(i)$轉移,那麼有轉移$g[i][j]=g[i-k][j]+t\cdot a[j][k]+a[k][j]-(t\cdot a[k][j]-a[j][k])$,其中$k=lowbit(i)$,時間複雜度降為$o(m\cdot 2^)$,但空間複雜度變為$o(m\cdot 2^)$

對空間優化,有乙個十分巧妙的做法:考慮g中修改1位的複雜度為$o(m)$,同時由於對0不斷高精度+1加到$2^m$複雜度均攤$o(1)$,那麼從小到大列舉i並對g暴力修改即可,時間複雜度不變,空間複雜度降為$o(2^+m)$

1 #include2

using

namespace

std;

3int n,m,t,x,y,a[105][105],f[10000005],g[105];4

intmain()

12for(int i=0;i0

;13 memset(f,0x3f,sizeof

(f));

14 f[0]=0;15

for(int i=0;i

29for(int j=0;j)

30if ((i&(1

<0)f[i|(1

<1

32 printf("

%d",f[(1

<1

]);33 }

view code

Loj10094 訊息的傳遞

題目描述 我們的郭嘉大大在曹操這過得逍遙自在,但是有一天曹操給了他乙個任務,在建鄴城內有 nnn 個袁紹的奸細,將他們從 111 到 nnn 進行編號,同時他們之間存在一種傳遞關係,即若ci,j 1c 1c i,j 1,則奸細 iii 能將訊息直接傳遞給奸細 jjj。現在曹操要發布乙個假訊息,需要傳...

QT的訊號槽值傳遞

c 的rtti提供執行時的型別資訊,qt使用元物件來提供更加強大的內省功能,能在執行時獲取物件的屬性和方法。qt 的訊號看起來像是乙個只有宣告沒有定義的函式,在訊號發射時,會發生拷貝過程 如果訊號有和槽函式繫結,那麼訊號的引數再傳遞給槽函式,又會發生乙個拷貝過程。class myclass mycl...

QT訊號槽傳遞引數技巧

訊號槽如何傳遞引數 或帶引數的訊號槽 利用qt進行程式開發時,有時需要訊號槽來完成引數傳遞。帶引數的訊號槽在使用時,有幾點需要注意的地方,下面結合例項進行介紹。第一點 當訊號與槽函式的引數數量相同時,它們引數型別要完全一致。訊號 cpp view plain void isignal intb 槽 ...