레스토랑

21632 단어 예제동적 기획
레스토랑
기왕 나무라면 dp를 받아야 한다. 나무라면 dp를 받아야 한다. 나무라면 dp를 받아야 한다. dp[s][j]는 s를 뿌리로 하는 자수에서 j보를 걷는 가장 큰 가치를 나타낸다. 그러나 우리는 이렇게 하면 답을 통계할 수 없다는 것을 발견했다. dp[s][j]는 s를 뿌리로 하는 자수에서 j보를 걷는 가장 큰 가치를 나타낸다. 그러나 우리는 이렇게 하면 답을 통계할 수 없다는 것을 발견했다.s를 뿌리로 하는 자수 안에서 j보를 걷는 가장 큰 가치를 나타낸다. 그러나 우리는 이렇게 하면 답을 통계할 수 없다는 것을 발견했다.
정의dp[s][j][0/1]는 s를 뿌리로 하는 자수 안에서 j보를 걷고 최종적으로 s로 돌아가거나 돌아가지 않는 최대 가치를 나타낸다. 그리고 정의dp[s][j][0/1]는 s를 뿌리로 하는 자수 안에서 j보를 걷고 최종적으로 s로 돌아가거나 돌아가지 않는 최대 가치를 나타낸다. 그리고 정의dp[s][j][0/1]는 s를 뿌리로 하는 자수 안에서 j보를 걷고 최종적으로 s로 돌아가거나 돌아가지 않는 최대 가치를 나타낸다.그리고 옮길 수 있어요.
한 v에 대해 s의 다른 노드를 걷고 다시 s로 돌아갈 수도 있고, 다시 v로 갈 수도 있고, 먼저 v를 갈 수도 있다. 다시 s의 가치는 한 v에 대해 s의 다른 노드를 걷고 다시 s로 돌아갈 수도 있다. 다시 v를 갈 수도 있고, 먼저 v를 갈 수도 있다. 다시 s의 가치는 한 v에 대해 s의 다른 노드를 걷고 다시 s로 돌아갈 수도 있고, 다시 v를 걷고 다시 s를 갈 수도 있다.
#include
using namespace std;

const int N=505;
int dp[N][N][2],n,m,a[N],head[N],cnt=0,size[N];
struct edge{
	int link,v;
}q[N<<1];
void put(int x,int y){
	q[++cnt].v=y;
	q[cnt].link=head[x];
	head[x]=cnt;
}
void dfs(int s,int fa){
	dp[s][1][1]=a[s],size[s]=1;
	for(int i=head[s];i;i=q[i].link){
		int v=q[i].v;
		if(v==fa) continue;
		dfs(v,s);
		size[s]+=size[v];
	}
}
void dfs2(int s,int fa){
    int sum=1;
	for(int i=head[s];i;i=q[i].link){
		int v=q[i].v;
		if(v==fa) continue;
		dfs2(v,s);
		int up=4*sum-4,up2=4*size[v]-4;
		if(sum==1) up=1;
		if(size[v]==1) up2=1;
		up=min(up,m),up2=min(up2,m);
		for(int j=up;j>=0;j--){
			for(int kk=up2;kk>=0;kk--)
			{
			if(kk+j+2<=m)dp[s][kk+j+2][1]=max(dp[s][kk+j+2][1],dp[s][j][1]+dp[v][kk][1]);
			if(kk+j+2<=m)dp[s][kk+j+2][0]=max(dp[s][kk+j+2][0],dp[s][j][0]+dp[v][kk][1]);
			if(kk+j+1<=m)dp[s][kk+j+1][0]=max(dp[s][kk+j+1][0],dp[s][j][1]+max(dp[v][kk][0],dp[v][kk][1]));
		}
	 }
		sum+=size[v];
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		put(u,v),put(v,u);
	}
	dfs(1,0);
	dfs2(1,0);
	printf("%d",max(dp[1][m][0],dp[1][m][1]));
}

좋은 웹페이지 즐겨찾기