TPA算法實驗作業
第一題:
-
其實這題等價於背包問題求具體方案(不了解可以百度)。
如果寫過背包問題求具體方案這道題很容易解出,先看一下背包問題求具體方案的模板題。
https://www.acwing.com/solution/content/2687/
看完這篇博客不難看出這次的題目完全就是背包問題求具體方案換了個問法,只需要按價值排序后按背包問題求具體方案來做,以下是個人代碼供參考
第二題:
- 思路:前綴和裸題沒什么好說的(不知道什么是前綴和自己百度一下),也可以用老師說的動態規划思想來做(注意開long long,會爆int),以下是個人代碼供參考
第三題:
-
奇技淫巧(騙分大法),可以找奇偶規律,能騙24分QAQ。
-
正經思路:區間DP問題,假設我是玩家1,對手是玩家2
每一個格子是我作為一個玩家,設身處地地假設我本人或我的對手面對着區間(i,j),作出最好的選擇后能領先的最多分數。當我面對着(i,j)區間,我作為一個玩家每次只能選擇i位置或j位置。
如果我選擇了i,那么我的對手將會獲得(i+1,j)格子內的分數;
而如果我選擇了j,我的對手將獲得(i,j-1)格子內的分數。
而這(i+1,j)格子和(i,j-1)格子內有多少分數,是我站在對手的角度為他思考而最多能領先分數。敲黑板:只要我站在格子(i,j)在做判斷,此時的我的身份可能是我自己,也可能是我在為想象的對手考慮!
那么我站在這個區間,會選擇i還是j呢?
假如我選擇i,那么我的對手會領先(i+1,j)格子內的分數,而我新吸收了i位置的分數,所以我會比我的對手領先a[i]-f(i+1,j)
假如我選擇j,那么我的對手會領先(i,j-1)格子內的分數,而我新吸收了j位置的分數,所以我會比我的對手領先a[j]-f(i,j-1)
兩者取其大即可。
注:f(i,j)是DP表格中(i,j)位置的分數,即不論是我(玩家1)還是對手(玩家2)在這個格子作出選擇后能領先的最多分數完成整張表之后,我怎么知道我(玩家1)能不能在對手(玩家2)也作出最好的選擇的情況下還是領先呢?
只要看DP(0,len(a)-1)的位置里的領先分數是否>=0就可以了,因為在動態規划更新的過程中,每一個格子都是我為自己,或者為對手設身處地思考得到的最佳分數。
而我現在查看DP(0,len(a)-1)這個位置,就代表我在這個位置是擁有選擇權的。而我(玩家1)確實在這個位置有選擇權,因為我是全局先手。以下是個人代碼供參考**
第四題:
- 思路:二維費用背包模板題,只需要像01背包一樣做,只不過多一維表示容積,多一層for循環來判斷是否超過當前容積即可以下是個人代碼供參考