做网站一般用什么系统设计制作软件
做网站一般用什么系统,设计制作软件,网络公司的名字,如何免费制作小程序我们先来看几个比较简单的例子来引入#xff1a; 我们令f[i]表示以i为根节点的子树大小#xff0c;易得状态转移方程为#xff1a;
f[i]1f[son1]....f[soni];
我们用DFS即可#xff0c;下面是大致的模板#xff1a; 让我们来看看几道题吧#xff1a;
1.贪心树形DPDFS 我们令f[i]表示以i为根节点的子树大小易得状态转移方程为
f[i]1f[son1]....f[soni];
我们用DFS即可下面是大致的模板 让我们来看看几道题吧
1.贪心树形DPDFS 对于叶子节点它要多少就弄多少然后我们再分析它的父亲节点假如它的子树还缺那么就选其子树上最小的值即可。
因此我们维护好每一个子树的min然后再DFS一下各个子树所需的数量即可。
下面是AC代码
#includebits/stdc.h
using namespace std;int n,t[100010],head[100010],cnt,p,root,min1[100010];
long long sum0,c[100010];
struct node{int dian,next;
}edge[100010];
void merge(int x,int y){edge[cnt].diany;edge[cnt].nexthead[x];head[x]cnt;
}
int dfsmin(int root){if(head[root]-1){min1[root]t[root];return t[root];}min1[root]t[root];for(int ihead[root];i!-1;iedge[i].next){min1[root]min(dfsmin(edge[i].dian),min1[root]);}return min1[root];
}
long long dfssum(int root){if(head[root]-1){sumc[root]*min1[root];return c[root];}long long ckck0;for(int ihead[root];i!-1;iedge[i].next){ckckdfssum(edge[i].dian);}if(ckckc[root]){sum(c[root]-ckck)*min1[root];ckckc[root];}return ckck;
}
int main(){memset(head,-1,sizeof(head));cinn;for(int i1;in;i){scanf(%d%d%d,p,c[i],t[i]);if(p-1){rooti;continue;}merge(p,i);}dfsmin(root);dfssum(root);coutsum;
}
接题 我们要求的即为一个点当他删去后要让形成的树中节点最多的尽量小。
我们考虑一个点删去它的儿子形成树它的父亲节点以上也形成了树。
于是我们令f[i]为删去i后最大联通快的大小
f[i]max(tot[k],n-tot[i]),tot为树的大小用树形dp维护即可。
下面是AC代码
#includebits/stdc.h
using namespace std;
int n,head[1010],x,y,cnt,sum[1010],inc[1010],root,f[1010];
struct node{int dian,next;
}edge[1005];
void merge(int x,int y){edge[cnt].diany;edge[cnt].nexthead[x];head[x]cnt;
}
int dfssum(int root){if(head[root]-1){return sum[root]1;}sum[root]1;for(int ihead[root];i!-1;iedge[i].next){sum[root]dfssum(edge[i].dian);}return sum[root];
}
int main(){cinn;memset(head,-1,sizeof(head));for(int i1;in-1;i){cinxy;merge(x,y);inc[y];}for(int i1;in;i){if(inc[i]0){rooti;break;}}dfssum(root);int ans1000000,ans1,jj;for(int i1;in;i){int ckck-1;for(int jhead[i];j!-1;jedge[j].next){ckckmax(ckck,sum[edge[j].dian]);}ans1max(ckck,n-sum[i]);if(ans1ans){ansans1;jji;}}coutjj ans;
}
接题 我们令f[i][0]表示i节点不选时它和它的子树快乐最大指数f[i][1]表示i节点选时它和它的子树快乐最大指数因此我们得到状态转移方程为
f[i][0]max(f[j][0],f[j][1])
f[i][1]hi
f[ri][0]0,f[ri][1]hri(ri为叶子节点
结果就是max(f[root][0],f[root][1]).
下面是AC代码
#includebits/stdc.h
using namespace std;
int n,head[6010],cnt,inc[6010],x,y,root,dp[6010][2],h[6010],pos[6010][2];
struct node{int dian,next;
}edge[6010];
void merge(int x,int y){edge[cnt].diany;edge[cnt].nexthead[x];head[x]cnt;
}
int dfs(int root,int k){if(pos[root][k]1) return dp[root][k];if(k1){dp[root][k]h[root];for(int ihead[root];i!-1;iedge[i].next){dp[root][k]dfs(edge[i].dian,0);}}else{for(int ihead[root];i!-1;iedge[i].next){dp[root][k]max(dfs(edge[i].dian,0),dfs(edge[i].dian,1));}}pos[root][k]1;return dp[root][k];
}
int main(){memset(head,-1,sizeof(head));cinn;for(int i1;in;i) cinh[i];for(int i1;in-1;i){cinxy;merge(y,x);inc[x];}cinxy;for(int i1;in;i){if(inc[i]0){rooti;break;}}int jjdfs(root,1);int ggdfs(root,0);coutmax(jj,gg);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89633.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!