977 AlvinZH过生日(背包DP大作战S)
977 AlvinZH過(guò)生日
思路
難題。逆推DP。
要明確dp的狀態(tài)只與是否有選擇權(quán)有關(guān),而與選擇權(quán)在誰(shuí)手里無(wú)關(guān)。因?yàn)椴徽撨x擇權(quán)在誰(shuí)手里,那個(gè)人都會(huì)盡可能的獲得最大的蛋糕重量。
dp[i]表示分配到第i個(gè)物品為止,當(dāng)前擁有選擇權(quán)的人能獲得的最大蛋糕重量,即蛋糕[i~n]的最大值。以有選擇權(quán)的的人列一個(gè)轉(zhuǎn)移方程,然而因?yàn)槲覀冎恢莱跏歼x擇的是AlvinZH,因此我們要逆推:
dp[i] = max(dp[i+1], sum - dp[i+1] + val[i]);//max(不吃, 吃)
其中sum為[i+1~n]蛋糕總質(zhì)量,最后dp[1]就是AlvinZH獲得的最大價(jià)值。
注意:
- 注釋里的吃與不吃并不是一直針對(duì)同一個(gè)人的,指的是當(dāng)前有選擇權(quán)的人對(duì)當(dāng)前蛋糕吃與不吃。
- 整個(gè)過(guò)程沒(méi)有管AlvinZH吃還是不吃,針對(duì)的對(duì)象是有選擇權(quán)的那個(gè)人。
分析
這道題很有意思,巧妙地避過(guò)了選擇權(quán)在誰(shuí)手里的問(wèn)題,dp求解的是有選擇權(quán)能獲得的最大價(jià)值,并沒(méi)有考慮誰(shuí)有選擇權(quán)。
逆推也很有意思,因?yàn)橹恢篱_(kāi)始時(shí)選擇權(quán)在AlvinZH手里。
好好理解吧,神奇的DP,你對(duì)它一無(wú)所知。
參考代碼一
// // Created by AlvinZH on 2017/11/5. // Copyright (c) AlvinZH. All rights reserved. //#include <cstdio> #include <cstring> #include <iostream> using namespace std;int n; int sum;//表示i+1~n塊蛋糕的總量 int val[105], dp[105];int main() {while(~scanf("%d", &n)){sum = 0;memset(dp, 0, sizeof(dp));for(int i = 1; i <= n; ++i)scanf("%d", &val[i]);for(int i = n; i >= 1; --i){dp[i] = max(dp[i + 1], sum - dp[i + 1] + val[i]);//max(不吃, 吃)。sum += val[i];}printf("%d\n", dp[1]);} }轉(zhuǎn)載于:https://www.cnblogs.com/AlvinZH/p/7867597.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的977 AlvinZH过生日(背包DP大作战S)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IO流练习题 实现图片的加密解密操作
- 下一篇: Qt QString 与char* 相互