PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
Prob_Solve
[解決] 01背包的分堆變形題
作者:
fatcat8127
(胖胖貓)
2020-10-08 16:36:02
先上題目:e900:交換紙牌遊戲
https://zerojudge.tw/ShowProblem?problemid=e900
題目要求和01背包的變形問題-分堆一樣,要求分成兩堆且數字和越接近越好。
但這個題目多了限制就是在最少的翻牌次數...。
這邊提供通過的程式碼:https://ideone.com/qQ5iL5
問題差異:
選某張卡片正面的點數時是加上差值且翻牌次數不變,否則必定選擇反面,
加上「負的差值」且次數多一,分堆問題時只要考慮選不選某個數字,
不選時狀態不變,但這題不選時因為加上「負的差值」狀態會改變。
狀態設定:
狀態改變時會有負數,陣列不能存取負的位置所以需要做偏移,
最糟糕的情況=負最多時,每張牌的範圍是(-12,12),牌數最多1000張,
總和=(-12000,12000) ... 陣列的空間要求。
base(偏移量)=所有牌的負值總和。
初始狀態:用到的數字=0(做完偏移後是 base)且該狀態下翻牌次數=0
cnt[ 目前使用的陣列 ][ 偏移後的數字 ]= 最少的翻牌次數
狀態轉移:
根據第i張牌,只需更新 pvt (上一次有紀錄到的數字),避免重複紀錄這一次更新
到的狀態,只要檢查該格位置是否第一次更新。
不翻:v(新狀態)=pvt+num[0][i]-num[1][i]且 翻牌次數不變
cnt[now][v]=min(cnt[now][v],cnt[pre][pvt])
翻牌:v(新狀態)=pvt+num[1][i]-num[0][i]且 翻牌次數多一
cnt[now][v]=min(cnt[now][v],cnt[pre][pvt]+1)
輸出時從兩堆差值=0,1(-1 or 1)... 依此類推直到找到第1個次數的狀態不是
INF 就是答案。
作者:
ucrxzero
(RX-0)
2020-10-18 18:19:00
請問這比leetcode難嗎
作者:
ddavid
(謊言接線生)
2020-10-21 09:06:00
leetcode有簡單題也有難題,樓上你想問什麼
作者:
ucrxzero
(RX-0)
2020-10-21 10:29:00
找工作需要寫這個嗎
作者:
ddavid
(謊言接線生)
2020-10-21 13:34:00
看你找什麼工作,還有演算法題從來就不只是為了讓你背題到時工作解一模一樣的問題到時工作你不會直接看到背包問題,卻會用到解題思維以及動態規劃、greedy、divide and conquer、tree、graph等等概念,寫演算法題是為了讓你懂得怎麼自己思考應用這些概念當然你可找個用不上解題思維的工作,但這個版就是解題版XD看到你在別的版也問過leetcode的問題,也許我在Python以前這篇拋磚的文章可以給你一點參考?XD
#1UQl27Mt (Python)
作者:
ucrxzero
(RX-0)
2020-10-30 20:53:00
OK
繼續閱讀
[解決] ZeroJudge-c271 疊疊樂(Easy)
fatcat8127
[問題] 立方體之排列組合問題
ab850726
[問題] 將零矩陣轉為特定矩陣
obelisk0114
[問題] UVa11865 Directed Graph的MST
darrenlee1
[問題] 哪些問題是程式碼問題 哪些是程式問題
hayuyang
[問題] 一般樹和二元樹轉換觀念
fightforlive
[問題] 關於運算式的相等
nevikw39
[問題] 數字分成 k組 最小化最大值
s89162504
[問題] hashmap找得到value卻找不到對應的key?
hayuyang
[討論] 有向圖路徑問題
triumphant10
Links
booklink
Contact Us: admin [ a t ] ucptt.com