有依賴關係的樹形揹包,算是又積累了一種做法
乙個經典的做法就是設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...