1. 程式人生 > >【NOIP2017模擬9.3A組】摘果子

【NOIP2017模擬9.3A組】摘果子

Description

這裡寫圖片描述

Input

這裡寫圖片描述

Output

這裡寫圖片描述

Sample Input

7 9
39 6
13 2
22 6
7 4
-19 5
28 6
-17 1
2 1
3 2
4 1
5 4
6 2
7 3

Sample Output

52

Solution

就是樹上揹包問題,有一個很經典的做法
按照dfs序反著來dp,那麼f[i][j]表示的就是dfs序為i的點,受了j的毒的值
如果i這個點選,那麼f[i][j]可以從f[i+1][j-p[i]]轉移過來
否則可以從f[跨過i這個子樹的下一個值][j]轉移過來
為什麼是正確的呢?
顯然只選子樹或只選兄弟是正確的
但是又要選子樹又要選兄弟呢?
會發現到我子樹的dfs最大的一個點的時候,它會將它+1的位置轉移過來,也就是把兄弟轉移了過來
那麼又選子樹又選兄弟就包含在選子樹中了

Code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define N 20100
using namespace std;
int n,m,a[N],b[N],f[4050][4050],last[N],next[N],to[N],tot=0,dfn[N],ls[N],c[N];
void putin(int x,int y)
{
    next[++tot]=last[x];last[x]=tot;to[tot]=y;
} void dg(int x) { dfn[x]=++tot;c[tot]=x; for(int i=last[x];i;i=next[i]) { if(dfn[to[i]]) continue; dg(to[i]); } ls[x]=tot; } int main() { scanf("%d%d",&n,&m); fo(i,1,n) scanf("%d%d",&a[i],&b[i]); fo(i,1,n-1) { int x,y;scanf("%d%d",&x,&y);
putin(x,y);putin(y,x); } tot=0; dg(1); fd(i,n,1) { fo(j,0,m) { if(j>=b[c[i]])f[i][j]=max(f[i][j],f[i+1][j-b[c[i]]]+a[c[i]]); f[i][j]=max(f[i][j],f[ls[c[i]]+1][j]); } } int ans=0; fo(i,0,m) ans=max(ans,f[1][i]); printf("%d",ans); }

相關推薦

NOIP2017模擬9.3A果子

Description Input Output Sample Input 7 9 39 6 13 2 22 6 7 4 -19 5 28 6 -17 1 2 1

[JZOJ5344]NOIP2017模擬9.3A果子

Description Solution 樹形依賴揹包裸模型 F[i][j]表示表示DFS序上第i~N個已經做完了,重量為j F[i][j]=max(F[i+1][j−weight[

jzoj5343NOIP2017模擬9.3A健美貓

description solution 可以把點投射到以i座標為x座標,以a[i]為y座標的二維平面,考慮維護兩條斜率為1直線,點到直線豎直距離和即為答案,分別為維護多少個點在直線上,用兩個桶

jzoj5340NOIP2017模擬9.2A春思

description solution 分解質因數然後等比數列求和,可能沒有逆元(本程式沒有處理這種情況),這時候需要特殊處理。 code #include<cstd

JZOJ-senior-5958. NOIP2018模擬11.8A祕密郵件

Time Limits: 1000 ms Memory Limits: 524288 KB Description 小 A 收到了一封來自外星球的祕密郵件。郵件由 n 個大寫英文字母組成,不巧的是小A 收到郵件以後一不小心打亂了原來的字母順序。但是聰明的小 A 記住了原郵件的完整

jzoj5956 NOIP2018模擬11.7Aeasy LCA (結論)

分析 死因:思路錯了 一開始在考慮尤拉序和原序列單調棧的問題,這樣想其實可以分治(超麻煩)。 注意到一個結論,假如你要求n個點的lca,那麼你可以以任意順序排序,然後對相鄰求lca,再求深度最小的即可。 證明很顯然,考慮尤拉序,答案肯定會至少被一組相鄰的點蓋到, 這樣

jzoj5954 NOIP2018模擬11.5A走向巔峰(直徑性質,期望)

Description 眾所周知,DH是一位人生贏家,他不僅能虐暴全場,而且還正在走向人生巔峰; 在巔峰之路上,他碰到了這一題: 給出一棵n個節點的樹,我們每次隨機染黑一個葉子節點(可以重複染黑),操作無限次後,這棵樹的所有葉子節點必然全部會被染成黑色。 定義R為這棵樹不經過黑點的直

3520. NOIP2013模擬11.7B原根

Description Input 有且只有一個正整數m。 Output 以遞增序依次輸出模m的所有原根,每行輸出一個原根。 如果不存在模m的原根,輸出-1。 Sample Input 7 Sample Output 3 5 Data Constrai

JZOJ5958. NOIP2018模擬11.8A祕密郵件

Description 小 A 收到了一封來自外星球的祕密郵件。郵件由 n(n≤1000000) 個大寫英文字母組成,不巧的是小A 收到郵件以後一不小心打亂了原來的字母順序。但是聰明的小 A 記住了原郵件的完整內容,現在她每次可以選擇打亂後的郵件中相鄰的兩個字母

JZOJ-senior-5952. NOIP2018模擬11.5A凱旋而歸

Time Limits: 1000 ms Memory Limits: 524288 KB Description Input 第一行一個整數 n,表示數的個數。 第二行n個整數,第i個整數為ai

JZOJ-senior-5960. NOIP2018模擬11.8A小喬

Time Limits: 1000 ms Memory Limits: 524288 KB Description Input Output Sample Input 3 8 2 1 -8 8

NOIP2013模擬11.6A靈能矩陣(pylon)

時間有保證,空間也不大(第一頁第一個) 好了,說回正題 一看樣例,感覺好像就是個裸的dfs,但在打程式碼的時候發現有毒。。。 比如說一個非葉子節點i,如果它要散逸能量的話一定要散逸son[i]的倍數,那樣的話: 這個資料: 10 0 0 0 3 3 3 2 2 2 2 1 2 1 3 2

jzoj2702. 探險&jzoj3917. NOIP2014模擬11.2A福慧雙修

Description 探險家小T好高興!X國要舉辦一次溶洞探險比賽,獲獎者將得到豐厚獎品哦!小T雖然對獎品不感興趣,但是這個大振名聲的機會當然不能錯過! 比賽即將開始,工作人員說明了這次比賽的規則:每個溶洞和其他某些溶洞有暗道相連。兩個溶洞之間可能有多條道路,也有可能沒有,但沒

NOIP2013模擬11.5Acza的蛋糕(cake)

Description: cza特別喜歡吃海苔,怎麼吃也吃不夠。cza的生日到來時,他的父母給他買了許許多多的海苔和一個生日蛋糕。海苔是一個12或21的長方形,而蛋糕則是一個nm的矩陣。蛋糕上有一些蠟燭佔據了位置,其他地方都可以放海苔。cza的父母讓cza把海苔儘可能多的放在蛋糕

JZOJ5954.NOIP2018模擬11.5A走向巔峰

PROBLEM 給出一棵n個節點的樹,我們每次隨機染黑一個葉子節點(可以重複染黑),操作無限次後,這棵樹的所有葉子節點必然全部會被染成黑色。 定義R為這棵樹不經過黑點的直徑,求使R第一次變小期望的步數。 前置知識:樹的直徑的性質、期望的線性性 如果一棵樹有多條直徑,當直徑

JZOJ5956.NOIP2018模擬11.7Aeasy LCA

PROBLEM 給定一個n個節點的樹,給定一個排列,求所有連續子段的節點的LCA的深度和。 SOLUTION 這題有很多種方法。 分治 考慮跨過區間中點的答案,從中線往兩邊掃,掃過左半邊和右半邊的LCA一定是在兩條鏈上,那麼合併這兩條鏈上任意點對的答案,掃一遍就可以了。另

NOIP2018模擬11.7Ascarborough fair

PROBLEM 求無向圖期望聯通快的個數。 SOLUTION 考慮將每一個聯通塊的貢獻獨立,我們需要得知一個聯通塊內部聯通的概率,與其不與外面任何一個點聯通的概率。 考慮一種經典的做法。我們要求聯通的概率,用1減去不連通的概率。我們設F[S]表示S這個聯通塊聯通的概率。轉移我

JZOJ5959NOIP2018模擬11.8A鐵路運輸

Description Input Output Data Constraint   題意:給出一個邊權為1的無向圖,q次操作,將一條邊的邊權變為2,每次操作後詢問有多少個點的通往1的最短路比所有操作前的最短路小。   

JZOJ 5959. NOIP2018模擬11.8A鐵路運輸

題目大意 有張n個點,m條邊的圖,設dis[i]為1到i的最短路徑。 第i次修改,將某條邊的邊權從1變成2。 求i次修改後,有多少個i的dis[i]變了。 題解 考慮最短路是怎麼一步步求出來的。 考慮最

3522. NOIP2013模擬11.7B迷宮花園(maze)

Description 給定一個一定存在從起點到終點的路徑的四聯通迷宮。已知Tar左右方向移動的時間為1,上下移動的時間為未知實數v。求當Tar從起點到終點的最短移動時間為已知實數L時,未知實數v是多