裡面包含了很多內容的一道題 可以學到很多
題意 很簡單 就是乙個人 要繞城市一圈 不必回到起點 但是每個城市都要經過 並且最多每個重複走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 4view codeusing
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 }
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...