hdu 1054 Strategic Game 樹形dp基礎&&模板
阿新 • • 發佈:2019-02-06
第一次獨立的寫出來樹形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]); } }