树形DP

 

Appleman and Tree

 CodeForces - 461B 

题意:

题解:http://blog.csdn.net/u011580493/article/details/39032195

 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 }
View Code

 

Treasure Hunt I

 ZOJ - 3626 

 题意:

 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 }
View Code

 

The Ghost Blows Light

 HDU - 4276

题意:

 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 }
View Code

 

Tree

 HDU - 3534

 题意:

 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 }
View Code

 

Matrix

 HDU - 4313

 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 }
View Code

 

posted @ 2017-08-12 11:50  yijiull  阅读(165)  评论(0编辑  收藏  举报