HDU 3001(狀態壓縮dp)

2021-07-16 13:59:28 字數 2465 閱讀 8633

`這是我第一次寫的過了所有的樣例,但是wa因為題目是說每個點可以走兩次,而我剛開始以為這題就是裸的旅行家問題,後台資料一定專門設定了某個點重複走兩次會更小的情況,所以這裡需要一種新的方法,三進製!標記

提供幾組測試資料:

輸入 5 5

2 1 1

3 1 1

4 1 1

5 1 1

2 5 10

答案 14

輸入 8 9

2 1 1

3 1 1

4 1 1

5 1 1

2 5 10

4 7 1

4 6 1

4 8 1

8 7 10

答案 27

輸入 1 0

答案 0

#include 

#include

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int route[15][15];

int dp[1

<< 10][10];

int main()

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

int end =( 1

<< n ) - 1;

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

for (int i = 0; i <= end; i++)}}

}}

int min=inf;

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

if (min > inf - 100)

else

}return

0;}

正確ac**

#pragma warning(disable:4996)

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int state[12];//儲存3進製

int visited[60000][12];

int dp[60000][12];//狀態為i時以j結尾的最小權值

intmap[12][12];//儲存圖

int n, m;

void initiate()

儲存3進製每一位對應的數值

for (int i = 0; i <= state[10]; i++)//將 所有不超過59049的數以三進製的形式儲存下來,

//這樣只需要處理一邊節省時間,如果是只能訪問一邊不需要處理因為,電腦本身就是二進位制

}}int main()

int max = inf;

for (int i = 0; i//列舉所有狀態

}

if (flag)

return

0;}

#pragma warning(disable:4996)

#include

#include

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f;

int state[12];

int visited[80000][15];

intmap[15][15];

int dp[80000][15];

void init()

for (int i = 0; i < state[10] - 1; i++)

}}int main()

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

for (int i = 0; i 0][i] = 0;

}for (int i = 0; i <= state[n] - 1; i++)}}

int min = inf;

int s = 0;

for (int i = 0; i for (int i = s; i <= state[n] - 1; i++)

if (flag)

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

}if (min == inf)

cout

<< "-1"

<< endl;

else

cout

<< min << endl;

}return

0;}

hdu 3001(狀態壓縮dp)

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

hdu3001 三進製 狀態壓縮dp

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

hdu 3001 類似旅行商

裡面包含了很多內容的一道題 可以學到很多 題意 很簡單 就是乙個人 要繞城市一圈 不必回到起點 但是每個城市都要經過 並且最多每個重複走2次 注意 城市數量是 10的 如果 你以前就遇到過 類似的題 肯定能很快反應過來 狀壓dp 在某一維開個3維陣列 0 1 2分別城市在該狀態下經過某城市的次數為多...