P1352 沒有上司的舞會+P1122 最大子樹和(樹形DP入門)

来源:https://www.cnblogs.com/lzyan-blog/archive/2023/01/18/17059005.html
-Advertisement-
Play Games

前言 今日偶然打開 $oi-wiki$,發現樹形 $DP$ 例題正好是之前在洛谷上鴿著的一道題。所以...... $\color{red}{很高興以這樣的方式認識你,樹形 DP !}$ 這例題造的太好了,簡直是無痛入門(感動.jpg) P1352 沒有上司的舞會 題目傳送門~ 思路剖析 狀態定義 $ ...


前言

今日偶然打開 \(oi-wiki\),發現樹形 \(DP\) 例題正好是之前在洛谷上鴿著的一道題。所以......

\(\color{red}{很高興以這樣的方式認識你,樹形 DP !}\)

這例題造的太好了,簡直是無痛入門(感動.jpg)

P1352 沒有上司的舞會

題目傳送門~

思路剖析

狀態定義

\(dp_i\) 表示的是以 \(i\) 為根節點的子樹所獲得的最大價值。

由於每個節點代表著一位人物,有來與不來兩種狀態,所以再加一維狀態變數。

\(dp_{i,0}\) 表示以 \(i\) 為根節點的子樹所能獲得的最大價值,且這位人物沒來。 \(dp_{i,1}\) 則對應來了的狀態。

狀態轉移方程

 現在有個周年慶宴會,宴會每邀請來一個職員都會增加一定的快樂指數 r_i。
 但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。

根據題意描述,容易得出狀態轉移方程:

\(dp_{i,0} += max (dp_{j,0},dp_{j,1})\)

\(dp_{i,1} += dp_{j,0}\)

\(j\) 指的是 \(i\) 的子節點,且顯然 \(dp_{i,1}\) 的初始值為 \(r_i\)

code

點擊查看代碼
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a[6005];
int head[6005],nex[6005],edge[6005],tot;
int vis[6005],dp[6005][2];
void dfs(int x){
	dp[x][1]=a[x];
	for(int i=head[x];i;i=nex[i]){
		int y=edge[i];
		dfs(y);
		dp[x][1]+=dp[y][0];
		dp[x][0]+=max(dp[y][0],dp[y][1]);
	}
	return;
} 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<n;i++){
		int l,k;
		scanf("%d%d",&l,&k);
		nex[++tot]=head[k];
		head[k]=tot;
		edge[tot]=l;
		vis[l]=1;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dfs(i);
			cout<<max(dp[i][0],dp[i][1])<<endl;
			return 0;
		}
	}
}

P1122 最大子樹和

題目傳送門~

思路剖析

誰是根節點

由於這題是無向圖(但由於以 \(n-1\) 條邊相連接,所以本質與樹並無太大區別),所以要討論以誰作為根節點。

根節點之所以重要,是因為在遞歸過程中,我們已經預設根節點所代表的那束花已經被保留了,但根節點代表的花不一定在最優解的集合之中。

仔細模擬後,不難發現,對於以 \(i\) 為根節點的子樹,\(dp_i\) 往下為最優解,而往上由於還未更新,因此相當於剪去 \(dp_i\) 與其根節點的枝椏。

進一步推理,無論通過哪個節點作為根節點,再遞歸的過程中,其實已經變相枚舉了將其剪去的種種情況,所以,只需要在過程中取最優解即可。

狀態定義+狀態轉移方程

這點比較好理解,所以合併在一起闡述。

\(dp_i\) 表示以 \(i\) 為根節點的子樹所獲得的最大美麗值。

顯然有

\(dp_i+=max(dp_j,0)\)

\(j\) 為子節點,當其所帶來的價值為負數時,不如直接剪掉。

code

有幾處雷點在註釋中標記出來了(都是血淚教訓啊QAQ)

點擊查看代碼
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,ans=-0x3f3f3f3f;//答案可能為負!要初始化為負無窮
int head[16005],nex[35005],edge[35005],tot;//由於是雙向邊,所以空間要開雙倍
int dp[16005],vis[16005];
void dfs(int x){
	vis[x]=1;//不要在迴圈內標記,否則標記不到根節點本身。
	for(int i=head[x];i;i=nex[i]){
		int y=edge[i];
		if(vis[y]) continue;
		dfs(y);
		if(dp[y]<=0) continue;
		dp[x]+=dp[y]; 
	}
	ans=max(ans,dp[x]);
	return;
} 
void add(int l,int k) {nex[++tot]=head[k],head[k]=tot,edge[tot]=l;}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&dp[i]);
	for(int i=1;i<n;i++){
		int l,k;
		scanf("%d%d",&l,&k);
		add(l,k);
		add(k,l);
	}
	dfs(1);
	cout<<ans<<endl;
	return 0;
}

\(7、8\) 道,(‾◡◝)。

加油!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用數據處理函數 函數 與其他大多數電腦語言一樣,SQL支持利用函數來處理數據。函數一般是在數據上執行的,它給數據的轉換和處理提供了方便。 註意: 函數沒有SQL的可移植性強:能運行在多個系統上的代碼稱為可移植的(portable)。函數的可移植性卻不強。幾乎每種主要的DBMS的實現都支持其他實現 ...
  • 京東物流:康睿 姚再毅 李振 劉斌 王北永 說明:以下全部均基於elasticsearch8.1 版本 一.跨集群檢索 - ccr 官網文檔地址: https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cross-cl ...
  • 前言 做線上幀率監控上報時,少不了需要弄明白如何通過代碼獲取實時幀率的需求,這篇文章通過圖解配合Flutter性能調試工具的方式一步步通俗易懂地讓你明白獲取幀率的基礎知識,以後再也不愁看不懂調試工具上指標了。 說說 List<FrameTiming> Flutter 中通過如下方式監聽幀率,addT ...
  • 華為運動健康服務(HUAWEI Health Kit)6.9.0版本新鮮出爐啦! 一文瞭解新增功能,快來一起加入Health Kit生態大家庭! 一、更豐富:睡眠呼吸記錄健康數據開放 呼吸機是用於為患者提供或增加肺通氣的常用醫療器械,目前越來越多的家用呼吸機被用於緩解人們在日常睡眠過程中的打鼾、睡眠 ...
  • 2023-01-17 一、Servlet底層源碼分析 1、Servlet結構圖 說明:HttpServlet繼承了GenericServlet類,GenericServlet實現了“ServletConfig”和“Servlet”兩個介面,因此所以要實現一個Servlet直接就可以繼承HttpSer ...
  • 2023-01-13 一、基本功 (1)工程結構管理 掌握企業環境的搭建和管理 (2)java開發規範 P3C開發規約 (3)高併發及網路編程 需要考慮性能瓶頸 (4)底層源碼分析 二、互聯網常用技術——分散式 1、NoSQL資料庫:是提升數據訪問效率的優先選擇。 訪問效率的提升:Redis、Mon ...
  • 1. API 網關誕生背景 前言 API 經濟生態鏈已經在全球範圍覆蓋, 絕大多數企業都已經走在數字化轉型的道路上,API 成為企業連接業務的核心載體, 並產生巨大的盈利空間。快速增長的 API 規模以及調用量,使得企業 IT 在架構上、模式上面臨著更多的挑戰。 API 是什麼 API 網關是一個服 ...
  • CAP特性 ​ CAP理論是在設計分散式系統的過程中,處理數據一致性問題時必須考慮的理論,一個分散式系統最多只能同時滿足一致性(Consistence)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。 2000年7月Eric Brewer教授 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...