Apple Tree POJ - 2486

来源:http://www.cnblogs.com/hehe54321/archive/2017/11/09/poj-2486.html
-Advertisement-
Play Games

Apple Tree POJ - 2486 題目大意:一棵點帶權有根樹,根節點為1。從根節點出發,走k步,求能收集的最大權值和。 樹形dp。複雜度可能是O(玄學),不會超過$O(nk^2)$。(反正這題不卡這個,考思想)參考 ans[i][j][0]表示i點以下共走j步,不回來,可能收集到最大的權值 ...


Apple Tree POJ - 2486

題目大意:一棵點帶權有根樹,根節點為1。從根節點出發,走k步,求能收集的最大權值和。

樹形dp。複雜度可能是O(玄學),不會超過$O(nk^2)$。(反正這題不卡這個,考思想)參考

ans[i][j][0]表示i點以下共走j步,不回來,可能收集到最大的權值
ans[i][j][1]表示i點以下共走j步,回來,可能收集到最大的權值

比較複雜的是,每個節點(以下稱當前節點)從其子節點轉移的時候,需要用一個背包:

t[i][j][0]表示當前節點的前i個子節點共走j步,不回來
t[i][j][1]表示當前節點的前i個子節點共走j步,回來

對於t[i][j][0],要麼是當前節點的前i-1個子節點共走j步(包括去和回來前面的子節點所用步數),在之前就不回來;

要麼是前i-1個子節點共走j-p步(包括去和回來前面的子節點所用步數),當前節點走到第i個子節點用1步,第i個子節點向下走p-1步,不回來;

要麼是花一步走到第i個子節點,在第i個子節點往下走p-2步,再花一步走回當前節點,再在前i-1個子節點中走j-p步(包括去和回來前面的子節點所用步數)並且不回來。

因此t[i][j][0]=max(t[i-1][j][0],max{t[i-1][j-p][1]+ans[nowson][p-1][0]},max{t[i-1][j-p][0]+ans[nowson][p-2][1]})

對於t[i][j][1],要麼是前i-1個子節點共走j-p步(包括去和回來前面的子節點所用步數),走到第i個子節點花1步,第i個子節點向下走用p-2步並回來,從第i個子節點回來花一步;要麼是前i-1個子節點共走j步(包括去和回來前面的子節點所用步數),回來。

因此t[i][j][1]=max(t[i-1][j][1],max{t[i-1][j-p][1]+ans[nowson][p-2][1]})

當然實際求解的時候並不需要每個節點開一個t數組,只需要在ans數組上直接做就行了。就是先對t數組求解過程用滾動數組優化,那麼只需要兩維t[j][0/1]。這時只需要把ans[當前節點]的數組當做t去做就行了。另外,求解t數組的邊界要註意一下。另外,t數組再求解前就全部初始化成當前節點權值就行了。

最終答案很顯然:max(ans[1][k][0],ans[1][k][1])。

曾經錯誤:

naive的轉移方程:

t[i][j][0]=max(t[i-1][j][0],t[i-1][j-p][0],t[i-1][j-p][1]+ans[son][p][0])
t[i][j][1]=max(t[i-1][j][1],t[i-1][j-p][1]+ans[son][p][1])

事實上,這道題轉移t[i][j][0]的第3種(標紅的)情況很容易遺漏。另外,很容易忽略走去與走回子節點花費的1或2步。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 struct Edge
 6 {
 7     int to,next;
 8 }edge[210];
 9 int ne,ans[110][210][2],f1[110];
10 int a[110];
11 int n,k;
12 bool vis[110];
13 void dfs(int u)
14 {
15     int j,kk=f1[u],p,v;
16     vis[u]=true;
17     for(j=0;j<=k;j++)
18         ans[u][j][0]=ans[u][j][1]=a[u];
19     while(kk!=0)
20     {
21         v=edge[kk].to;
22         if(!vis[v])
23         {
24             dfs(v);
25             for(j=k;j>=0;j--)
26             {
27                 for(p=1;p<=j;p++)
28                     ans[u][j][0]=max(ans[u][j][0],max(ans[u][j-p][0]+ans[v][p-2][1],ans[u][j-p][1]+ans[v][p-1][0]));
29                 for(p=2;p<=j;p++)
30                     ans[u][j][1]=max(ans[u][j][1],ans[u][j-p][1]+ans[v][p-2][1]);
31             }
32         }
33         kk=edge[kk].next;
34     }
35 }
36 int main()
37 {
38     int i,ta,tb;
39     while(scanf("%d%d",&n,&k)==2)
40     {
41         ne=0;
42         memset(ans,0,sizeof(ans));
43         memset(vis,0,sizeof(vis));
44         memset(f1,0,sizeof(f1));
45         for(i=1;i<=n;i++)
46             scanf("%d",&a[i]);
47         for(i=1;i<n;i++)
48         {
49             scanf("%d%d",&ta,&tb);
50             edge[++ne].to=tb;
51             edge[ne].next=f1[ta];
52             f1[ta]=ne;
53             edge[++ne].to=ta;
54             edge[ne].next=f1[tb];
55             f1[tb]=ne;
56         }
57         dfs(1);
58         printf("%d\n",max(ans[1][k][0],ans[1][k][1]));
59     }
60     return 0;
61 }

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

-Advertisement-
Play Games
更多相關文章
  • springmvc+hibernate+jdbctemplate+mysql 原文鏈接:http://blog.csdn.net/rugaxm/article/details/8551905 先看下麵小段代碼,一個controller,一個service。 controller.java代碼: .. ...
  • 在APP中內嵌H5頁面,若頁面上存在下載鏈接,沒有任何反應,為什麼呢? 原因是app中內嵌的H5頁面是WebView解析的,什麼是WebView呢? 在Android手機中內置了一款高性能webkit內核瀏覽器,在SDK中封裝為一個叫做WebView組件。 WebView控制調用相應的WEB頁面進行 ...
  • 前言 在使用tomcat時,經常會遇到連接數、線程數之類的配置問題,要真正理解這些概念,必須先瞭解Tomcat的連接器(Connector)。 在前面的文章 詳解Tomcat配置文件server.xml 中寫到過:Connector的主要功能,是接收連接請求,創建Request和Response對象 ...
  • 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/7804185.html 前面講到:Java IO編程全解(五)——AIO編程 為了防止由於對一些技術概念和術語的理解或者叫法不一致而引起歧義,這裡對涉及到的專業術語或者技術用語做下聲明:如果它們與其他一些地方的 ...
  • 三大特征:封裝,繼承,多態 多態:簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。 抽象:抽象是將一類對象的共同特征總結出來構造類的過程 包裝,可以講基本類型當做對象來使用,抽象只關心對象有那些屬性和行為,而不關心這些行為的細節是什麼。 Integer:當數值在 128 127之間的時 ...
  • Shiro簡介 Apache Shiro是Java的一個安全框架,官網為shiro.apache.org,主要場景為控制登陸,判斷用戶是否有訪問某個功能的許可權等等。 Shiro的核心功能(入門知識,只介紹前兩個) 認證 授權 會話管理 加密 引入jar包和配置web.xml 引入Shiro對應的ja ...
  • Triangular Pastures POJ - 1948 sum表示木條的總長。a[i]表示第i根木條長度。ans[i][j][k]表示用前i條木條,擺成兩條長度分別為j和k的邊是否可能。 那麼ans[i][j][k]=ans[i-1][j-a[i]][k] || ans[i-1][j][k-a ...
  • 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 12 using namespace std; 13 const int... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...