HDU1561:The more, The Better——題解

http://acm.hdu.edu.cn/showproblem.php?pid=1561

ACboy很喜歡玩一種戰略游戲,在一個地圖上,有N座城堡,每座城堡都有一定的寶物,在每次游戲中ACboy允許攻克M個城堡并獲得里面的寶物。但由于地理位置原因,有些城堡不能直接攻克,要攻克這些城堡必須先攻克其他某一個特定的城堡。你能幫ACboy算出要獲得盡量多的寶物應該攻克哪M個城堡嗎?

O(n*m^2)的復雜度相信大家已經都會了。

(代碼注釋區域的dfs)

這里介紹一種O(n*m)的算法,參考https://www.cnblogs.com/Patt/p/5642181.html與徐持衡的論文。

設dp[i][j]為取根節點到i節點路徑上的所有點,再從這條路徑的左邊上和i的子樹上取j體積的點的最大價值。最后答案為dp[0][m]。

(看起來這個定義沒法想,但是徐的論文給的方法是泛化物品合并……這個方法到現在還沒有看懂。)

對于所謂“路徑的左邊”可理解為dfs序比i小且不在這條路徑上的合法路徑。

(更饒了*2)

有一個看起來很妙的方程dp[u][j]=max(dp[u][j],dp[v][j-1]);

當然在這之前每個兒子我們都需要更新,dp[v][j]=dp[u][j]+w[v],然后把v遞歸跑一遍。

(思考為什么不是dp[u][j+1])

(卡了很久思索出了結果,實際很簡單,對dp[u][j]狀態它根本沒選擇v及其子樹的點,所以初始時dp[v][j]選擇的j個點正好是dp[u][j]的j個點)

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N=250;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct node{int to,nxt;
}e[N];
int cnt,head[N];
int n,m,w[N],dp[N][N];
inline void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
/*void dfs(int u){for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;dfs(v);for(int j=m;j>=2;j--){//保證無后效性for(int k=1;k<j;k++){dp[u][j]=max(dp[u][j],dp[u][k]+dp[v][j-k]);}}}
}*/
void dfs(int u,int c){if(c<=0)return;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;for(int j=0;j<c;j++){dp[v][j]=dp[u][j]+w[v];}dfs(v,c-1);for(int j=1;j<=c;j++){dp[u][j]=max(dp[u][j],dp[v][j-1]);}}
}
int main(){while(scanf("%d%d",&n,&m)!=EOF&&n+m){n++;cnt=0;memset(head,0,sizeof(head));for(int i=1;i<n;i++){int u=read()+1,v=i+1;w[v]=read();add(u,v);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=w[i];}}dfs(1,m);printf("%d\n",dp[1][m]);}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

轉載于:https://www.cnblogs.com/luyouqi233/p/8831338.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu列出所有磁盤_列出Ubuntu上的磁盤空間使用情況

ubuntu列出所有磁盤Simply open a new Terminal window and type in this command 只需打開一個新的終端窗口并輸入此命令 df -Th f翻譯自: https://www.howtogeek.com/howto/ubuntu/list-disk-space-usage-on-ubuntu/ubuntu列出所有磁盤

python基礎之字符編碼

閱讀目錄 一 了解字符編碼的知識儲備二 字符編碼介紹三 字符編碼應用之文件編輯器3.1 文本編輯器之nodpad3.2 文本編輯器之pycharm3.3 文本編輯器之python解釋器3.4 總結四 字符編碼應用之python4.1 執行python程序的三個階段4.2 python2與python3字符串類型的區別一 了解字符編…

C# WinForm開發系列 - DataGridView

1.DataGridView實現課程表 testcontrol.rar 2.DataGridView二維表頭及單元格合并 DataGridView單元格合并和二維表頭.rar myMultiColHeaderDgv.rar 3.DataGridView單元格顯示GIF圖片 gifanimationindatagrid.rar 4.自定義顯示DataGridView列(行頭顯示行號與圖標,同一單元格顯示…

ruby語法_Ruby函數(方法)語法

ruby語法The Ruby language makes it easy to create functions. Ruby語言使創建函數變得容易。 Function Syntax 功能語法 def functionname(variable) return <value>end def functionname(variable)return <值>結束Examples 例子 Your function can compute …

011-git-將tag推送到遠端

1、將tag推送到遠端 在使用TortoiseGit過程中&#xff0c;push推送過程中&#xff0c;選擇include tag&#xff0c;遠端就有次分支。

pageadmin CMS網站建設教程:站點添加自定義字段

首先看看pagedmin默認的站點設置都有什么&#xff0c;如下圖&#xff1a; 這里只有一些最基本的參數設置&#xff0c;用過3.0版本或用過其他公司開發的cms的用戶應該有這種體驗&#xff0c;在站點設置中可以設置logo圖片&#xff0c;備案號&#xff0c;底部內容等等。 那么為什…

如何將世界時鐘和時區小部件添加到您的iPhone

When you work remotely or have friends and family who live in another country, it’s important to know what time it is across time zones. A world clock (or time zone) widget on your iPhone’s Home screen makes this much easier. 當您遠程工作或有家人和朋友居…

Python網絡爬蟲之三種數據解析方式

引入 回顧requests實現數據爬取的流程 指定url基于requests模塊發起請求獲取響應對象中的數據進行持久化存儲其實&#xff0c;在上述流程中還需要較為重要的一步&#xff0c;就是在持久化存儲之前需要進行指定數據解析。因為大多數情況下的需求&#xff0c;我們都會指定去使用聚…

一行代碼實現底部導航欄TabLayout

歡迎關注公眾號&#xff1a;JueCode app中底部導航欄已經是很常見的控件了&#xff0c;比如微信&#xff0c;簡書&#xff0c;QQ等都有這類控件&#xff0c;都是點擊底部標簽切換界面。主要的實現手段有 RadioGroupFragmentTabLayoutTabLayoutBottom Navigation其中TabLayout一…

小程序視頻截gif_3個簡單的應用程序,可讓您深入視頻和GIF

小程序視頻截gifDeepfakes make it possible to manipulate videos and GIFs. The technology has become so easy to use, you can now create deepfakes right on your phone. That’s right—you can now easily insert yourself into a meme. 借助Deepfake &#xff0c;可以…

【AtCoder】ARC095 E - Symmetric Grid 模擬

【題目】E - Symmetric Grid 【題意】給定n*m的小寫字母矩陣&#xff0c;求是否能通過若干行互換和列互換使得矩陣中心對稱。n,m<12。 【算法】模擬 【題解】首先行列操作獨立&#xff0c;如果已確定行操作&#xff0c;那么兩個在對稱位置的列要滿足條件必須其中一列反轉后和…

一、內存尋址

1.內存地址分類: 邏輯地址、線性地址、物理地址 邏輯地址:段選擇符偏移量 線性地址:C語言中取地址符&打印出來的地址就是這個地址&#xff0c;也叫虛擬地址。 物理地址:內存總線尋址的具體地址&#xff0c;是真實存在的。 邏輯地址通過分段單元轉換成線性地址&#xff0c;線…

如何使用Google TV設置Chromecast

Justin Duino賈斯汀杜伊諾(Justin Duino)Google changed up its streaming platform with the release of the Chromecast with Google TV. Instead of being a Cast-only device like Chromecasts before it, Google’s latest dongle runs the successor of Android TV. If y…

js之 foreach, map, every, some

js中array有四個方法 foreach, map, every, some&#xff0c;其使用各有傾向。 關注點一&#xff1a;foreach 和 map 無法跳出循環&#xff0c;每個元素均執行foreach 和 map 無法跳出循環&#xff0c;他們是對每個數組元素調用 callback&#xff1b; foreach 無返回值&#xf…

scala 方法、函數定義小結

2019獨角獸企業重金招聘Python工程師標準>>> package scalapackage.testmethod/*** Created by Germmy on 2018/4/15.*/ object TesMethod {def main(args: Array[String]) {//定義方法的一種方法,高階函數的一種定義方法def m1(x:Int)(y:Int)x*yval resm1(3)(4)pri…

ipad和iphone切圖_如何在iPhone和iPad上密碼保護照片

ipad和iphone切圖Sometimes, you need to protect your iPhone or iPad photos from prying eyes that might also have access to your device. Unfortunately, Apple doesn’t provide an obvious, secure way to do this. However, there’s a work-around thanks to the No…

Java高級篇(二)——網絡通信

網絡編程是每個開發人員工具箱中的核心部分&#xff0c;我們在學習了諸多Java的知識后&#xff0c;也將步入幾個大的方向&#xff0c;Java網絡編程就是其中之一。 如今強調網絡的程序不比涉及網絡的更多。除了經典的應用程序&#xff0c;如電子郵件、Web瀏覽器和遠程登陸外&…

Navigator 對象,能夠清楚地知道瀏覽器的相關信息

Navigator 對象屬性 appCodeName屬性 功能&#xff1a;返回瀏覽器的代碼名。該屬性是一個只讀的字符串。 語法&#xff1a;navigator.appCodeName 總結&#xff1a;在所有以Netscape代碼為基礎的瀏覽器中&#xff0c;它的值是"Mozilla"。為了兼容起見&#xff0c;在M…

Jerry和您聊聊Chrome開發者工具

2019獨角獸企業重金招聘Python工程師標準>>> Chrome開發者工具是Jerry日常工作使用的三大調試器之一。雖然工具名稱前面帶了個"開發者", 但是它對非開發人員仍然有用。不信&#xff1f; 用Chrome打開我們常用的網站&#xff0c;按F12&#xff0c;在Consol…

BZOJ4314 倍數?倍數!

好神仙啊.... 題意 在$ [0,n) $中選$ k$個不同的數使和為$ n$的倍數 求方案數 $ n \leq 10^9, \ k \leq 10^3$ 題解 k可以放大到1e6的 先不考慮$ k$的限制 對答案構建多項式$ f(x)\prod\limits_{i0}^{n-1}(x^i1)$ 答案就是這個多項式所有次數為$ n$的倍數的項的系數和 考慮單位…