#include #include #include #define max1 10
#define max2 59049 // 3^10
#define inf 0x3f3f3f3f
using namespace std;
/*由於每個點可經過兩次 用三進製數表示狀態 例10020(三進製)表示經過點2兩次點1一次其餘點都沒經過*/
int n, m, ans;
int pow[max1 + 2], state[max2 + 2][max1 + 2];
//pow[n]意為3^n, state[n][m]意為狀態n下經過m點的次數
int dp[max2 + 2][max1 + 2], map[max1 + 2][max1 + 2];
//dp[n][m]意為狀態為n且現位於m點時的費用, map即為鄰接矩陣存圖
inline int min(int a, int b)
void init()
} //將十進位制數i轉化為三進製數,初始化state
}bool check(int x)
return flag;
//檢測狀態x是否經過所有點
}void dp()
} }}int main()
dp();
if(ans == inf)
ans = -1;
printf("%d\n", ans);
} return 0;
}
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...
hdu 3001 類似旅行商
裡面包含了很多內容的一道題 可以學到很多 題意 很簡單 就是乙個人 要繞城市一圈 不必回到起點 但是每個城市都要經過 並且最多每個重複走2次 注意 城市數量是 10的 如果 你以前就遇到過 類似的題 肯定能很快反應過來 狀壓dp 在某一維開個3維陣列 0 1 2分別城市在該狀態下經過某城市的次數為多...