4 26 刷題Day 1 樹形dp兩題

2022-05-20 09:28:17 字數 1877 閱讀 9424

#include #include #include #include using namespace std;

int n;

int head[6005],next[6005],last[6005];

int root;

int f[5][6005];

void dp(int x)

}int main()

for(int i=1;i<=n-1;i++)

//找樹的根

for(int i=1;i<=n;i++)

} dp(root);

printf("%d",max(f[1][root],f[0][root]));

return 0;

}

從根節點開始,我們對於每乙個點\(i\),用\(f[i][0]\)來表示不取\(i\)時的最大值,\(f[i][1]\)表示取\(i\)時的最大值

對於每乙個點\(i\),則有狀態轉移方程:

\[f[i][1]=h[i]+\sum f[j][0]

\]\[f[i][0]=\sum \max(f[j][1],f[j][0])

\]其中\(j\)是\(i\)的子節點,值得注意的是,當\(i\)不取的時候,對於\(i\)的子節點\(j\),我們也不一定要取,具體見**

struct edge

e[6001];//這一步是定義乙個結構體。

void add(int a,int b,int value)

//遍歷的**

for(int st[i];i != -1;i = e[i].last)

ac**:

#include#include#include#includeusing namespace std;

int n,t,d[6001],h[6001],cnt,head[6001],f[6001][2];

struct edge

edge[6001];

void ins(int a,int b)

void dfs(int x)

f[x][1]+=h[x];

}int main()

for(int i=1;i<=n;i++)

if (d[i]==0)

t=i;

dfs(t);

printf("%d",max(f[t][0],f[t][1]));

}

首先定義乙個f陣列,為f[i][1]和f[i][2]. f[i][1]裡面存的是,假如現在的這個人不去,那麼他的下屬就可以去, 可以得到動態轉移方程$$f[i][1] =\sum(\max(f[j][2],f[j][1]))$$

如果這個人要去,那麼就存於f[i][2]了,可得: $$f[i][2] =\sum(f[j][1]) + a[i]$$

#include#include#include#includeusing namespace std;

int t, n, m, dp[1005][605];

//dp[i][j]表示到第i個走廊,在這裡(及其子樹)要用j秒時間偷的最多畫數

struct node tr[5005];

inline int read()

while(ch>='0' &&ch<='9') red = red*10+ch-'0', ch = getchar();

return red*f_f;

}void dfs_read(int a)

}void dfs(int a, int r)

for (int i = 0; i <= r - tr[a].tim; i++)

}int main()

見**

leetcode每日兩題 Day1 簡單題2

3.無重複字元的最長子串 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入...

Day1刷題總結

如果進棧序列為e1,e2,e3,e4,則不可能的出棧序列是 d a.e2,e4,e3,e1 b.e4,e3,e2,e1 c.e1,e2,e3,e4 d.e3,e1,e4,e2 解析 對於a,進棧的順序是先把e1,e2進棧,再把e2出棧,再將e3,e4進棧,這時棧按順序剩下e1,e3,e4,出棧的順序...

刷題要緊 DAY 1

leetcode day 1 題目 給你乙個字串 s 請你返回滿足以下條件的最長子字串的長度 每個母音字母,即 a e i o u 在子字串中都恰好出現了偶數次。示例 1 輸入 s eleetminicoworoep 輸出 13 解釋 最長子字串是 leetminicowor 它包含 e,i,o 各...