我是靠谱客的博主 强健星星,最近开发中收集的这篇文章主要介绍某日企笔试第二题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


1 #include <bits/stdc++.h>

2

3 using namespace std;

4 const int N=1005,M=105;

5 int n,m;

6 vector <int> G[N];

7 bool vis[N];

8 int val[N];

9 int dp[N][M][4];
 10 void init()
 11 {
 12
for(int i=1; i<=n; i++) G[i].clear();
 13
memset(vis,0,sizeof(vis));
 14
memset(dp,0,sizeof(dp));
 15 }
 16 void input()
 17 {
 18
for(int i=1; i<=n; i++)
scanf("%d",&val[i]);
 19
for(int i=0; i<n-1; i++)
 20 
{
 21
int x,y;
 22
scanf("%d %d",&x,&y);
 23 
G[x].push_back(y);
 24 
G[y].push_back(x);
 25 
}
 26 }
 27 void dfs1(int i,vector <int> &son,int d[],int sum[],int fa)
 28 {
 29
int sz=son.size();
 30
if(i==sz)
 31 
{
 32
int D=100,SUM=0;
 33
for(int i=0; i<sz; i++)
 34 
{
 35
if(sum[i]) D=min(D,d[i]+1);
 36
SUM+=sum[i];
 37
if(SUM>m) return;
 38 
}
 39
if(D>2) D=2;
 40
int VAL=0;
 41
for(int i=0; i<sz; i++)
 42 
{
 43
VAL+=dp[son[i]][sum[i]][d[i]];
 44 
}
 45
if(D==1) VAL+=val[fa];
 46
dp[fa][SUM][D]=max(dp[fa][SUM][D],VAL);
 47
if(SUM+1>m) return;
 48
VAL=val[fa];
 49
for(int i=0; i<sz; i++)
 50 
{
 51
if(d[i]==2) VAL+=val[son[i]];
 52
VAL+=dp[son[i]][sum[i]][d[i]];
 53 
}
 54
dp[fa][SUM+1][0]=max(dp[fa][SUM+1][0],VAL);
 55
return;
 56 
}
 57
for(sum[i]=0; sum[i]<=m; sum[i]++) for(d[i]=0; d[i]<=2; d[i]++) dfs1(i+1,son,d,sum,fa);
 58 }
 59 void dfs(int u)
 60 {
 61
vis[u]=1;
 62
int t[105];
 63
vector <int> temp;
 64
for(int i=0; i<G[u].size(); i++)
 65 
{
 66
int v=G[u][i];
 67
if(vis[v]) continue;
 68 
temp.push_back(v);
 69 
dfs(v);
 70 
}
 71
int d[3],sum[3];
 72
dfs1(0,temp,d,sum,u);
 73 }
 74 int main()
 75 {
 76
while(cin>>n>>m)
 77 
{
 78 
init();
 79 
input();
 80
for(int i=1; i<=n; i++) if(G[i].size()==1)
 81 
{
 82 
dfs(i);
 83
for(int u=1; u<=n; u++)
 84 
{
 85
int MAX=0;
 86
for(int d=0; d<3; d++) for(int j=0; j<=m; j++)
 87 
{
 88
if(u==4||u==1) printf("dp[%d][%d][%d]=%dn",u,j,d,dp[u][j][d]);
 89
MAX=max(MAX,dp[u][j][d]);
 90 
}
 91
printf("%d: %dn",u ,MAX);
 92 
}
 93
int MAX=0;
 94
for(int d=0; d<3; d++) for(int j=0; j<=m; j++) MAX=max(MAX,dp[i][j][d]);
 95
printf("%dn",MAX);
 96
break;
 97 
}
 98 
}
 99
return 0;
100 }

 

转载于:https://www.cnblogs.com/kimi9py/p/6214812.html

最后

以上就是强健星星为你收集整理的某日企笔试第二题的全部内容,希望文章能够帮你解决某日企笔试第二题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部