#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 各...