入门题:
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;
}