블루 브리지 컵 - 결점 선택
n개의 노드가 있는 나무는 나무마다 정정수 권한이 있다.만약 점 하나가 선택된다면, 나무에 그와 인접한 점은 모두 선택할 수 없다.선택한 점의 권한과 최대는 얼마입니까?
문제 해결 방법:
이 모형은 트리 동태 기획 입문 제목,
dp[i][0]는 이 노드가 선택되지 않았음을 나타내고 dp[i][1]은 이 결점이 선택되었음을 나타낸다.
변환 방정식은 다음과 같습니다.
dp[u][1]+=dp[v][0];//u 결점을 선택하면 그와 인접한 결점을 선택하지 않는다.
dp[u][0]+=max(dp[v][0],dp[v][1]);u결점을 선택하지 않으면 그와 인접한 결점이 가장 큰 결과를 선택한다.
특히 주의해야 할 것은 이 문제의 결점 수량이 비교적 많기 때문에 인접표 저장변의 관계를 선택해야 한다
#include
#include
#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 100010
bool vis[maxn];
int dp[maxn][2];
int father[maxn];
int head[maxn];
int n;
int cnt;
struct Edge
{
int to,next;
}edge[2*maxn];
void add(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
void treedp(int u)
{
vis[u]=1;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v])
{
treedp(v);
dp[u][1]+=dp[v][0];
dp[u][0]+=max(dp[v][1],dp[v][0]);
}
}
}
void init()
{
cnt=0;
memset(dp,0,sizeof(dp));
memset(father,0,sizeof(father));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
}
int main()
{
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&dp[i][1]);
int root=0;
int begin=1;
for(int i=0;i
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.