您的位置:首页 > 其它

树形DP入门总结

2015-07-27 18:22 351 查看
入门题:

poj2342,poj1463

从这两道题看,基本解题思路均为构造树(有向树),根据DP(01背包)解题。

末班代码:(1463)

#include<iostream>

#include<fstream>

#include<set>

#include<stack>

#include<cmath>

#include<cstring>

using namespace std;

typedef long long LL;

const int mx=2000;

int dp[mx][2];

int fa[mx];

int n;

void creat(int v)

{

for(int i=0;i<n;i++)

{

if(fa[i]==v)

{

creat(i);

dp[v][0]+=dp[i][1];

dp[v][1]+=min(dp[i][0],dp[i][1]);

}

}

}

int main( )

{

// freopen("in.txt","r",stdin);

while(scanf("%d",&n)!=EOF)

{

memset(fa,-1,sizeof(fa));

for(int i=1;i<=n;i++)

{

int u,unum;

scanf("%d:(%d)",&u,&unum);

for(int j=1;j<=unum;j++)

{

int v;

scanf("%d",&v);

fa[v]=u;

}

}

for(int i=0;i<n;i++)

dp[i][1]=1,dp[i][0]=0;

int root=-1;

for(int i=0;i<n;i++)

{

if(fa[i]==-1)

{

root=i;

break;

}

}

creat(root);

int ans=min(dp[root][0],dp[root][1]);

printf("%d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: