第一次独立的写出来树形dp,但是是看着模板写的,发现树形dp只要找到父亲节点与儿子节点的关系,问题就好办了
之前初始化dp[u][1]=1
转移方程
dp[u][1]+=min(dp[v][0],dp[v][1]);
dp[u][0]+=dp[v][1];
void dfs(int u) { int i, j, k; vis[u]=1; 操作:u节点dp初始化 for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(vis[v]) continue; dfs(v); 操作:子节点状态转移到父亲节点 } }
void addedge(int x,int y){ edge[value].v=y; edge[value].next=head[x]; head[x]=value++; edge[value].v=x; edge[value].next=head[y]; head[y]=value++; } int main() { 操作:输入 操作:建图addedge(); dfs(根节点); printf("根节点的状态"); }
#include<iostream> #include<cstdio> #include<memory.h> using namespace std; #define maxn 1505 struct node{ int v,next; }edge[maxn*2]; int value; int head[maxn],dp[maxn][2],vis[maxn]; void dfs(int u){ // cout<<u<<endl; vis[u]=1; dp[u][1]=1; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(vis[v]) continue; dfs(v); dp[u][1]+=min(dp[v][0],dp[v][1]); dp[u][0]+=dp[v][1]; } return ; } void addedge(int x,int y){ edge[value].v=y; edge[value].next=head[x]; head[x]=value++; edge[value].v=x; edge[value].next=head[y]; head[y]=value++; } int main(){ // freopen("in.txt","r",stdin); int n,x,nn,y; while(~scanf("%d",&n)){ value=0; int start=-1; memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); while(n--){ scanf("%d:(%d)",&x,&nn); while(nn--){ scanf("%d",&y); addedge(x,y); } if(start==-1&&nn!=0){ start=x; } } dfs(start); printf("%d\n",dp[start][0]>dp[start][1]? dp[start][1]:dp[start][0]); } }