简单版的动态规划

来源:互联网 发布:淘宝暴露狂买家秀 编辑:程序博客网 时间:2024/04/27 15:57

问题描述

小北很喜欢玩计算机游戏,特别是战略游戏,但是有时他不能尽快找到解所以常常感到很沮丧。现在面临如下问题:他必须在一个中世纪的城堡里设防,城堡里的道路形成一棵无向树。要在结点上安排最少的士兵使得他们可以看到所有边。你能帮助他吗?

你的任务是给出士兵的最少数目。

输入格式

输入包含多组数据。每组数据表示一棵树,在每组数据中:

第一行是结点的数目。

接下来的几行,每行按如下格式描述一个结点:

结点标识符 : ( 道路的数目 ) 结点标识符1  结点标识符......  结点标识符道路的数目

或者

结点标识符 : (0)

对于 n (0<n<=1500) 个结点,结点标识符是一个从 0 到 n - 1 的整数。每条边在测试用例中只出现一次。

输出格式

对于每组数据,各给出一个整数表示士兵的最少数目.


测试输入
40:(1) 11:(2) 2 32:(0)3:(0)53:(3) 1 4 21:(1) 02:(0)0:(0)4:(0)
测试输出
12

源代码
#include <stdio.h>  #include <string.h>  #define min(x,y) ((x>y)?y:x)  #define N 1504   int dp[N][2], father[N], v[N], n;  int main()  {      int i, j, k, t1, t2, root=0;      void DFS(int root);      while(scanf("%d",&n)!=EOF){          memset(dp,0,sizeof(dp));          memset(father,0,sizeof(father));          memset(v,0,sizeof(v));          for(i=0;i<n;i++){              scanf("%d:(%d)",&t1,&t2);              if(i==0) root=t1;              for(j=0;j<t2;j++){                  scanf("%d",&k);                  father[k]=t1;              }                 }          DFS(root);          printf("%d\n",min(dp[root][0],dp[root][1]));      }      return 0;  }    void DFS(int root)  {      v[root]=1;      for(int i=0;i<n;i++){          if(!v[i] && father[i]==root){              DFS(i);              dp[root][1]=dp[root][1]+dp[i][0];              dp[root][0]=dp[root][0]+min(dp[i][0],dp[i][1]);          }      }      dp[root][0]++;  } 

0 0
原创粉丝点击