hdu 3001 類似旅行商

2022-05-13 17:07:40 字數 1351 閱讀 7046

裡面包含了很多內容的一道題 可以學到很多

題意 很簡單 就是乙個人 要繞城市一圈 不必回到起點 但是每個城市都要經過 並且最多每個重複走2次

注意 城市數量是 <=10的  如果 你以前就遇到過 類似的題 肯定能很快反應過來 狀壓dp 在某一維開個3維陣列 0 1 2分別城市在該狀態下經過某城市的次數為多少

所以 就是個 三進製的壓縮  蠻好的 以前只聽過二進位制 我孤陋寡聞了 =_=

dp轉移方程很簡單 主要是 列舉狀態的時候 各種細節要注意

dp[ state+three[j] ][j] = min( dp[ state+three[j] ][j] , dp[ state ][i] + mp[i][j] );

因為 城市個數實在是太水了 就用最簡單的 二維矩陣儲存吧 但會有重邊 需要更新取最小值

for( int i = 0 ; i)

這是個很重要的初始化 因為 我們沒有固定從哪個點出發 那就表示 任意一點都可以當做起點

1 #include 2 #include 3 #include 4

using

namespace

std;56

intn;

7const

int inf = 0x3f3f3f

;

8const

int v = 60000;9

const

int size = 11;10

intdp[v][size] , vis[v][size];

11int

mp[size][size];

12int

three[size];

1314

void

init( )

1522

for( int i = 1 ; i1] ; i++)

2330}31

}3233int

solve( )

3452}53

if( flag )

5459}60

}61return

ans;62}

6364

intmain()

6578

while( m--)

7985 ans =solve( );

86if( ans ==inf )

87 cout << -1

<

88else

89 cout << ans <

91return0;

92 }

view code

today:

忍受某段時光

然後會被自己感動

hdu 3001(狀態壓縮dp)

include include include define max1 10 define max2 59049 3 10 define inf 0x3f3f3f3f using namespace std 由於每個點可經過兩次 用三進製數表示狀態 例10020 三進製 表示經過點2兩次點1一次其餘...

HDU 3001(狀態壓縮dp)

這是我第一次寫的過了所有的樣例,但是wa因為題目是說每個點可以走兩次,而我剛開始以為這題就是裸的旅行家問題,後台資料一定專門設定了某個點重複走兩次會更小的情況,所以這裡需要一種新的方法,三進製!標記 提供幾組測試資料 輸入 5 5 2 1 1 3 1 1 4 1 1 5 1 1 2 5 10 答案 ...

hdu3001 三進製 狀態壓縮dp

都過了這麼久了。我連這麼基礎的狀態壓縮dp都不會。收穫 1 沒有關於樹這種說法中。要記得注意重邊,2 原來的多進製是這樣弄得。3 他這裡更新答案的時候是怎樣更新的。include include include include include include include include incl...