hrbust/哈理工oj 1809 再就业【状压dp】
| 再就業 | ||||||
| ||||||
| Description | ||||||
| ? ? 修水管沒修好,小胖子又失業了,于是又找了一份在婚姻介紹所的工作,現在老板又給小胖子出難題了,如果小胖子能解決,就可以重新再就業了。 ? ? 這里有n對男女士,任意一個男生對一個女生都有一個好感值,任意一個女生也對一個男生有好感值,給出一個好感值表,為了方便,用n*n的矩陣表示,(i,j)表示第i行表示男士(或女士)對第j列的女士(或男士)的好感度,問怎么安排n對相親才能使成功率最大,并且不存在搞基等事件發生。 ???? ? ? 小胖子感慨,沒文化真可怕,工作都沒了。 | ||||||
| Input | ||||||
| 第一行輸入一個整數t,代表測試次數,t不超過100。 對于每組數據的第一行輸入一個整數n,代表有多少對男女生,n大于0不超過16。 接下來是一個n*n的矩陣,每個數字分別表示i和j之間的好感度,好感度不超過10000。 | ||||||
| Output | ||||||
| 輸出最大相親的好感和。 | ||||||
| Sample Input | ||||||
| 2 2 1 5 2 1 3 1 2 3 6 5 4 8 1 2 | ||||||
| Sample Output | ||||||
| 7? | ||||||
| Author | ||||||
| sunshine@hrbust |
狀壓dp都是300+ms過的,看到幾位大神在理工oj上邊用KM算法秒到2ms,簡直不是人......................圖論渣表示還是去老老實實的用狀壓dp來搞定這個問題。
思路:
我們設dp【i】【j】表示第i行j狀態的最大好感值的和。
對于狀態j。假設j的值為5:,對應二進制的值為101,表示選取了第0行和第2行上邊的女孩。
辣么不難推出:
dp【i+1】【q((1<<k)+j)】=max(dp【i+1】【q((1<<k)+j)】,dp【i】【j】+a【i+1】【k】);
我們初始化dp矩陣為-1,然后初始化第0行dp【0】【1<<j】=a【0】【j】,然后向下一行開始dp,枚舉第0行的j狀態,如果當前這種狀態有值(不為-1)的話,我們再枚舉一下k,如果(j&(1<<k)!=0)【與運算同1為1,其他為0,可以方便用來判斷當前狀態里邊是否已經選取了第k列的女孩】辣么說明j狀態里邊沒有選取第k列的女孩。辣么就能符合狀態轉移方程。
AC代碼:
總結
以上是生活随笔為你收集整理的hrbust/哈理工oj 1809 再就业【状压dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [position]返回顶部
- 下一篇: 简说SQLite