[동적 기획] 자유 로 운 열쇠
(key.pas/c/cpp)
n , n n-1 。
, , , 。
, 。 , 1
(1 , , , 1
, ) , P, ?
, N, P。
n , 1~n 。 i+1 cost keys,
i 。
n-1 , x,y, x y 。
, 。
:key.in
5 5
1 2
1 1
1 1
2 3
3 4
1 2
1 3
2 4
2 5
: key.out
7
20% , n<=20
30% , n<=30
, p,n<=100, cost <= Maxint, keys<= Maxint
비교적 기본 적 인 트 리 DP먼저 두 갈래 를 더 돌리 고 DP 를 하면 됩 니 다.상태: f [i] [j] 로 i 라 는 서브 트 리 를 표시 하고 j 의 에 너 지 를 사용 하여 얻 을 수 있 는 최대 열쇠 수 를 표시 합 니 다.전이 방정식: f [i] [j] = max (f [son [i]]] [k] + f [bro [i]] [j - k - c [i]] + v [i], f [bro [i]] [j]).가장 자 리 를 읽 을 때 먼저 무방 향도 로 읽 고 무방 향도 에 따라 나 무 를 만든다. 그렇지 않 으 면 결과 가 심각 하 다.그리고 어떤 노드 가 소모 하 는 에 너 지 는 0 이 될 수 있 기 때문에 j = 0 은 경계 조건 으로 할 수 없다.ACCode:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <bitset>
using std::max;
const char fi[] = "key.in";
const char fo[] = "key.out";
const int maxN = 110;
const int maxM = 110;
const int MAX = 0x3fffff00;
const int MIN = -MAX;
struct Edge {int dest; Edge *next; };
Edge *edge[maxN];
int f[maxN][maxM];
int bro[maxN];
int son[maxN];
int c[maxN];
int v[maxN];
int n, m;
void init_file()
{
freopen(fi, "r", stdin);
freopen(fo, "w", stdout);
}
void insert(int u, int v)
{
Edge *p = new Edge;
p -> dest = v;
p -> next = edge[u];
edge[u] = p;
}
void readdata()
{
scanf("%d%d", &n, &m);
for (int i = 1; i < n + 1; ++i)
scanf("%d%d", c + i, v + i);
for (int i = 1; i < n; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
insert(u, v);
insert(v, u);
}
}
int DP(int i, int j)
{
if (i == 0) return 0;
if (f[i][j]) return f[i][j];
if (bro[i])
f[i][j] = max(f[i][j], DP(bro[i], j));
if (j >= c[i])
for (int k = 0; k + c[i] < j + 1; ++k)
{
f[i][j] = max(f[i][j], DP(son[i], k)
+ DP(bro[i], j - k - c[i]) + v[i]);
}
return f[i][j];
}
void Build(int u, int Last)
{
for (Edge *p = edge[u]; p; p = p -> next)
{
int v = p -> dest;
if (v != Last)
{
Build(v, u);
bro[v] = son[u];
son[u] = v;
}
}
}
void work()
{
Build(1, 0);
DP(1, m);
printf("%d", f[1][m]);
}
int main()
{
init_file();
readdata();
work();
exit(0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.