Jzoj5661 藥香沁鼻

2021-08-19 03:14:09 字數 926 閱讀 9143

有依賴關係的樹形揹包,算是又積累了一種做法

乙個經典的做法就是設f[x][j]表示在x子樹內,容量為j的最大獲利

那麼轉移可以寫成 f[x][j]=max v是x的子樹

我們在dp時記錄揹包的剩餘空間,就可以得到80分

乙個更好的優化就是用dfs序,複雜度直接下降為o(nm)

當然最快的做法還是直接在樹上做,我們還是設f[x][j]表示x節點子樹取到最大的答案

那麼f[x][j]=max(f[x][j],f[x][j-w[y]]+v[u]) 發現轉移非常快,加上記錄揹包的剩餘空間,可以非常快的通過

#pragma gcc optimize("o3")

#pragma g++ optimize("o3")

#include

#include

#include

#define n 5010

using

namespace

std;

struct edge g[n];

int n,m,cnt,h[n],f[n][10010],v[n],w[n];

inline

void gmax(int& x,int y)

inline

void adj(int x,int y); h[x]=cnt;

}inline

void dfs(int x,int m)

}int main()

dfs(1,m-w[1]);

for(int j=m-w[1];j;--j) **f=max(**f,f[1][j]);

printf("%d\n",**f+v[1]);

}

命令提示OJ Problem 566

命令提示 執行時限 1000 ms 記憶體限制 256 mb 總提交 251次 通過 57次 題目描述 用過linux的shell的同學都知道,如果敲命令敲了一半,可以按tab鍵進行自動補全 條件是已經敲的字串是字典裡的某個字串字首 當然如果有多個候選項,那麼就不會補全。這種情況下,你多按幾次,sh...

566 重塑矩陣

在matlab中,有乙個非常有用的函式reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。如果具有給定引數的reshape...

566 重塑矩陣

在matlab中,有乙個非常有用的函式 reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。如果具有給定引數的reshap...