博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ 1479 +SPOJ 666 无向树最小点覆盖 ,第二题要方案数,树形dp
阅读量:6367 次
发布时间:2019-06-23

本文共 1420 字,大约阅读时间需要 4 分钟。

题意:求一颗无向树的最小点覆盖。 

  本来一看是最小点覆盖,直接一下敲了二分图求最小割,TLE。      

   树形DP,叫的这么玄乎,本来是线性DP是线上往前\后推,而树形DP就是在树上,由叶子结点状态向根状态推。

 dp[u][1/0]:表示,结点u,1:选择,0,:不选。dp值是以改点为根(目前为止,dfs遍历顺序自然决定了树的层)的已经选择点数,自然开始时不知道,对每个点,初值dp[u][0]=0、

dp[u][1]=1,回溯的时候:

                  1:dp[u][1]+=min(dp[v][1],dp[v][0]);该节点选择了,那么子节点可选可不选。

                   2:dp[u][0]+=dp[v][1];该节点没有选择,则其子节点必需选择。

        

#include
#include
#include
#include
#include
using namespace std;int n; vector
>v(100010);int vis[100010];int dp[100010][2]; inline int minn(int a,int b){ if(a

      666,求最优时候方案数,

     多一个DP方程即可。

#include
#include
#include
using namespace std;int n;vector
>v(100020);int vis[100020];struct state{ int light; int count;};state dp[100020][2];inline int minn(int a,int b){ if(a
dp[vv][0].light) dp[u][1].count=dp[u][1].count*dp[vv][0].count%10007; else dp[u][1].count=dp[u][1].count*(dp[vv][0].count+dp[vv][1].count)%10007; } }}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d",&n); int tx,ty; for(int i=0;i<=n;i++) { v[i].clear();vis[i]=0; } for(int i=0;i
dp[1][1].light) { printf("%d %d\n",ans1,dp[1][1].count); } else { int ans2= (dp[1][0].count%10007+dp[1][1].count%10007)%10007; printf("%d %d\n",ans1,ans2); } } return 0;}

转载于:https://www.cnblogs.com/yezekun/p/3925739.html

你可能感兴趣的文章
关于Boolean类型做为同步锁异常问题
查看>>
TestLink运行环境:Redhat5+Apache2.2.17+php-5.3.5+MySQL5.5.9-1
查看>>
Get File Name from File Path in Python | Code Comments
查看>>
显示本月每一天日期
查看>>
[转]java 自动装箱与拆箱
查看>>
NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
查看>>
think in coding
查看>>
IdHttpServer实现webservice
查看>>
HTML的音频和视频
查看>>
Unsupported major.minor version 52.0
查看>>
面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式
查看>>
优酷网架构学习笔记
查看>>
把HDFS里的json数据转换成csv格式
查看>>
WEEX-EROS | 集成并使用 bindingx
查看>>
广州牵引力来告诉你学编程先学什么语言好?
查看>>
广州牵引力总结初学者怎样学好UI设计?
查看>>
使用Metrics方法级远程监控Java程序
查看>>
Spring核心系列之Bean的生命周期
查看>>
VasSonic源码之并行加载
查看>>
小程序 LRU 存储设计
查看>>