树形DP
Appleman and Tree
题意:
题解:http://blog.csdn.net/u011580493/article/details/39032195
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int mod=1000000007; 5 const int maxv=1e5+10; 6 int b[maxv]; 7 struct Edge{ 8 int v,nex; 9 }e[maxv<<1]; 10 int head[maxv]; 11 int cnt=0; 12 void init(){ 13 memset(head,-1,sizeof(head)); 14 cnt=0; 15 } 16 void add(int u,int v){ 17 e[cnt].v=v; 18 e[cnt].nex=head[u]; 19 head[u]=cnt++; 20 } 21 ll dp[maxv][2]; 22 void dfs(int u,int f){ 23 if(b[u]) dp[u][1]=1; 24 else dp[u][0]=1; 25 for(int i=head[u];~i;i=e[i].nex){ 26 int v=e[i].v; 27 if(v==f) continue; 28 dfs(v,u); 29 dp[u][1]=(dp[u][1]*dp[v][0]+dp[u][1]*dp[v][1]+dp[u][0]*dp[v][1])%mod; 30 dp[u][0]=(dp[u][0]*dp[v][0]+dp[u][0]*dp[v][1])%mod; 31 } 32 } 33 int main(){ 34 int n; 35 scanf("%d",&n); 36 int u; 37 init(); 38 for(int i=1;i<n;i++){ 39 scanf("%d",&u); 40 add(u,i); 41 add(i,u); 42 } 43 for(int i=0;i<n;i++){ 44 scanf("%d",&b[i]); 45 } 46 dfs(0,-1); 47 printf("%lld\n",dp[0][1]); 48 }
Treasure Hunt I
题意:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=110; 4 struct Edge{ 5 int v,w,nex; 6 }e[maxn<<1]; 7 int head[maxn]; 8 int cnt=0; 9 void init(){ 10 memset(head,-1,sizeof(head)); 11 cnt=0; 12 } 13 void add(int u,int v,int w){ 14 e[cnt].v=v; 15 e[cnt].w=w; 16 e[cnt].nex=head[u]; 17 head[u]=cnt++; 18 } 19 int val[maxn]; 20 int dp[maxn][220]; 21 int k,m; 22 void dfs(int u,int f){ 23 for(int i=0;i<=m;i++) dp[u][i]=val[u]; 24 for(int i=head[u];~i;i=e[i].nex){ 25 int v=e[i].v; 26 if(v==f) continue; 27 dfs(v,u); 28 for(int j=m;j>=0;j--){ 29 for(int k=j;k>=e[i].w*2;k--){ 30 dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k-e[i].w*2]); 31 } 32 } 33 } 34 } 35 int main(){ 36 int n; 37 while(scanf("%d",&n)!=EOF){ 38 int u,v,w; 39 init(); 40 for(int i=1;i<=n;i++) scanf("%d",&val[i]); 41 for(int i=1;i<n;i++){ 42 scanf("%d%d%d",&u,&v,&w); 43 add(u,v,w); 44 add(v,u,w); 45 } 46 scanf("%d%d",&k,&m); 47 dfs(k,0); 48 int ans=0; 49 for(int i=0;i<=m;i++) { 50 ans=max(ans,dp[k][i]); 51 } 52 printf("%d\n",ans); 53 } 54 }
The Ghost Blows Light
题意:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=110; 5 const int inf=0x3f3f3f3f; 6 struct Edge{ 7 int v,w,nex; 8 }e[maxn<<1]; 9 int head[maxn]; 10 int cnt=0; 11 void init(){ 12 memset(head,-1,sizeof(head)); 13 cnt=0; 14 } 15 void add(int u,int v,int w){ 16 e[cnt].v=v; 17 e[cnt].w=w; 18 e[cnt].nex=head[u]; 19 head[u]=cnt++; 20 } 21 int n,m; 22 int mint; 23 int dp[maxn][510]; 24 int val[maxn]; 25 int dfs1(int u,int f){ 26 if(u==n) return 1; 27 for(int i=head[u];~i;i=e[i].nex){ 28 int v=e[i].v; 29 if(v==f) continue; 30 if(dfs1(v,u)){ 31 mint+=e[i].w; 32 e[i].w=0; 33 return 1; 34 } 35 } 36 return 0; 37 } 38 void dfs(int u,int f){ 39 for(int i=0;i<=m;i++) dp[u][i]=val[u]; 40 for(int i=head[u];~i;i=e[i].nex){ 41 int v=e[i].v; 42 if(v==f) continue; 43 dfs(v,u); 44 int c=e[i].w*2; 45 for(int j=m;j>=0;j--){ 46 for(int k=j;k>=c;k--){ 47 dp[u][j]=max(dp[u][j],dp[u][k-c]+dp[v][j-k]); 48 } 49 } 50 } 51 } 52 53 int main(){ 54 while(scanf("%d%d",&n,&m)!=EOF){ 55 init(); 56 int u,v,w; 57 for(int i=1;i<n;i++){ 58 scanf("%d%d%d",&u,&v,&w); 59 add(u,v,w); 60 add(v,u,w); 61 } 62 for(int i=1;i<=n;i++) scanf("%d",&val[i]); 63 mint=0; 64 dfs1(1,0); 65 if(mint>m){ 66 puts("Human beings die in pursuit of wealth, and birds die in pursuit of food!"); 67 continue; 68 } 69 m-=mint; 70 dfs(1,0); 71 printf("%d\n",dp[1][m]); 72 } 73 }
Tree
题意:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=100010; 4 const int inf=0x3f3f3f3f; 5 struct Edge{ 6 int v,w,nex; 7 }e[maxn<<1]; 8 int head[maxn]; 9 int cnt=0; 10 void init(){ 11 memset(head,-1,sizeof(head)); 12 cnt=0; 13 } 14 void add(int u,int v,int w){ 15 e[cnt].v=v; 16 e[cnt].w=w; 17 e[cnt].nex=head[u]; 18 head[u]=cnt++; 19 } 20 int ans,maxd; 21 int d[maxn],num[maxn]; 22 void dfs(int u,int f){ 23 num[u]=1; 24 d[u]=0; 25 for(int i=head[u];~i;i=e[i].nex){ 26 int v=e[i].v; 27 if(v==f) continue; 28 dfs(v,u); 29 int temp=d[v]+e[i].w; 30 if(temp+d[u]>maxd){ 31 maxd=d[u]+temp; 32 ans=num[u]*num[v]; 33 }else if(temp+d[u]==maxd){ 34 ans+=num[u]*num[v]; 35 } 36 if(d[u]<temp){ 37 d[u]=temp; 38 num[u]=num[v]; 39 }else if(d[u]==temp){ 40 num[u]+=num[v]; 41 } 42 } 43 } 44 45 int main(){ 46 int n; 47 while(scanf("%d",&n)!=EOF){ 48 int u,v,w; 49 init(); 50 for(int i=1;i<n;i++){ 51 scanf("%d%d%d",&u,&v,&w); 52 add(u,v,w); 53 add(v,u,w); 54 } 55 ans=0; 56 maxd=-inf; 57 dfs(1,0); 58 printf("%d %d\n",maxd,ans); 59 } 60 }
Matrix
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=100010; 5 const int inf=0x3f3f3f3f; 6 ll ans; 7 int flag[maxn]; 8 struct Edge{ 9 int v,w,nex; 10 }e[maxn<<1]; 11 int head[maxn]; 12 int cnt=0; 13 void init(){ 14 memset(head,-1,sizeof(head)); 15 cnt=0; 16 17 memset(flag,0,sizeof(flag)); 18 } 19 void add(int u,int v,int w){ 20 e[cnt].v=v; 21 e[cnt].w=w; 22 e[cnt].nex=head[u]; 23 head[u]=cnt++; 24 } 25 int dp[maxn]; 26 void dfs(int u,int f){ 27 dp[u]=inf; 28 int temp=0; // 29 for(int i=head[u];~i;i=e[i].nex){ 30 int v=e[i].v; 31 if(v==f) continue; 32 33 dfs(v,u); 34 if(flag[v]){ 35 if(flag[u]){ 36 ans+=(long long)min(dp[v],e[i].w); 37 }else{ 38 ans+=(long long)min(temp,min(dp[v],e[i].w)); 39 temp=max(temp,min(dp[v],e[i].w)); 40 if(dp[u]==inf) dp[u]=temp; 41 else dp[u]=max(dp[u],temp); 42 } 43 } 44 } 45 if(temp!=0) flag[u]=1; 46 } 47 int main(){ 48 int t; 49 scanf("%d",&t); 50 while(t--){ 51 init(); 52 int u,v,w; 53 int n,m; 54 scanf("%d%d",&n,&m); 55 for(int i=1;i<n;i++){ 56 scanf("%d%d%d",&u,&v,&w); 57 add(u,v,w); 58 add(v,u,w); 59 } 60 for(int i=0;i<m;i++){ 61 scanf("%d",&u); 62 flag[u]=1; 63 } 64 ans=0; 65 dfs(0,-1); 66 printf("%lld\n",ans); 67 } 68 }