这题太难了,树形dp根本不会
推荐一个树形dp的题解
http://www.cnblogs.com/QWsin/p/5306197.html
附上我抄的代码
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <cstring> 6 #include <cmath> 7 using namespace std; 8 const int N=1010; 9 const int INF=999999999; 10 int g[N][N],dp[N][5],n,x; 11 int main() 12 { 13 scanf("%d",&n); 14 for(int i=2;i<=n;i++) 15 { 16 scanf("%d",&x); 17 g[x][i]=1; 18 } 19 for(int i=n;i>=1;i--) 20 { 21 int x1=INF,x2=INF; 22 dp[i][0]=1; 23 for(int j=1;j<=n;j++) 24 { 25 if(g[i][j]) 26 { 27 dp[i][0]+=dp[j][4]; 28 dp[i][3]+=dp[j][2]; 29 dp[i][4]+=dp[j][3]; 30 x1=min(x1,dp[j][0]-dp[j][3]); 31 x2=min(x2,dp[j][1]-dp[j][2]); 32 } 33 } 34 dp[i][1]=dp[i][4]+x1; 35 dp[i][2]=min(dp[i][3]+x2,min(dp[i][0],dp[i][1])); 36 dp[i][3]=min(dp[i][2],dp[i][3]); 37 dp[i][4]=min(dp[i][3],dp[i][4]); 38 } 39 printf("%d ",dp[1][2]); 40 return 0; 41 }