zoukankan      html  css  js  c++  java
  • 树形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
    ",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
    ",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
    ",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
    ",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
    ",ans);
    67     }
    68 }
    View Code
  • 相关阅读:
    更新处理函数在对话框的菜单中不能工作
    msn登录时80048820错误
    C#编程指南:使用属性
    sqlserver中''与null的区别
    IP地址与主机名识别问题
    给EXCEL表格奇偶行设置不同的背景颜色
    sqlserver2000发布订阅
    Excel数据导入到Sqlserver2000
    SQLSERVER 获取时间 Convert函数的应用
    对路径“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\aa\……”的访问被拒绝
  • 原文地址:https://www.cnblogs.com/yijiull/p/7349731.html
Copyright © 2011-2022 走看看