大家好,欢迎来到IT知识分享网。
我不知道怎么把他删掉...
今晚WC文艺汇演wwww(等待唱歌.jpg
要是能截到屏一定发上来qwqqqqq
话说这首曲子是新发现的QAQ(Xeuphoria的还是那么好听qwqqq
今天学了快读qvq
还有…dpwww
P2015 二叉苹果树
有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)
这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。
我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树
2 5 \ / 3 4 \ / 1
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
这是一道树dp。。
然而我dp最差了qwqqqqqqq
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<set> #include<queue> #include<cmath> #define mod 1010 using namespace std; typedef long long ll; int n,q; int f[mod][mod];//f[i][j]表示节点i保留j个枝条的所剩苹果最大值QAQ int head[mod],x,y,z,cnt,b[mod]; int read() { int ans = 0,op = 1; char ch = getchar(); while(ch < '0' ||ch > '9') { if(ch == '-')op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { ans *= 10; ans += ch - '0'; ch = getchar(); } return ans * op; } struct edge { int next,to,v; }e[mod]; void add(int x,int y,int z) { ++cnt; e[cnt].to = y; e[cnt].v = z; e[cnt].next = head[x]; head[x] = cnt; } void dfs(int x,int dad) { for(int i = head[x];i;i = e[i].next) { int k = e[i].to; if(k == dad)//如果下一个相邻节点就是父节点,就证明到底层了,递归父节点的兄弟节点 { continue; } dfs(k,x); b[x] += b[k] + 1; for(int p = min(q,b[x]);p>=1;--p)//限制枝条数目qwq { for(int j = min(b[k],p-1);j >= 0;--j) { f[x][p] = max(f[x][p],f[x][p-j-1]+f[k][j]+e[i].v ); } } } } int main(){ n = read(); q = read(); for(int i = 1;i <= n-1;++i) { x = read(); y = read(); z = read(); add(x,y,z); add(y,x,z);//双向边qaq } dfs(1,0); printf("%d\n",f[1][q]); return 0; }
等会就能听见他们唱歌啦QAQ
期待QWQ
(没心情写下去了…
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29260.html