【LuoguP1273有线电视网】树形依赖背包

【LuoguP1273有线电视网】树形依赖背包

参考论文http://wenku.baidu.com/view/8ab3daef5ef7ba0d4a733b25.html

参考一篇写的很好的博文http://www.cnblogs.com/GXZC/archive/2013/01/13/2858649.html

题目链接http://www.luogu.org/problem/show?pid=1273

 

 

首先确定泛化物品的定义:价值随着体积变化的物体,如01背包中的f[i](体积为i时的最大价值最f[i])。

 

泛化物品+普通物品:

还是01背包,我们是怎么在泛化物品f[i]中加入一个体积为v,价值为w的普通物品的?

f[i]=max(f[i],f[i-v]+w);

O(n)解决。

 

分析题目:可以看作是叶子节点的v=1,非叶子节点的v=0,w=父亲到该点的费用*(-1)+该点的money。就是一个树形依赖模型,每个节点是一个物品。

设f[i][j]表示dfs序小于等于节点i的所有节点(物品)中,体积为j时的最大价值。

设s为i的一个孩子。

则f[i]管理的范围为红色圈,f[s]管理的范围为蓝色圈。

 

从上往下(父亲-->孩子)dfs时,先让f[s]=f[i](s继承i的全部信息)

强制让f[s]必须选择s,然后往下对s进行dp。

让f[s]必须选普通物品s是因为选择了s才能选s的孩子:f[s]=f[i]; f[s][j]=max(f[s][j],f[s][j-v]+w);就是说,f[s]=f[i]+物品s

如果不是选择孩子之前必须选择父亲:f[s]=max(f[i],f[i]+物品s)

 

回溯(孩子-->父亲)时:将f[s]与f[i]合并。

泛化物品的并: 因为两个泛化物品之间存在交集,所以不能同时两者都取,那么我们就需要求 泛化物品的并,对同一体积,我们需要选取两者中价值较大的一者,效率 O(C)。

F[j] = max{ F1[j] , F2[j] } (C>=j>=0)

 

 

我的代码以及注释:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 const int N=3010,Inf=(int)1e9;
 9 struct node{
10     int x,y,d,next;
11 }a[2*N];
12 int len,n,m;
13 int first[N],v[N],w[N],f[N][N],cost[N];
14 
15 int maxx(int x,int y){return x>y ? x:y;}
16 
17 void ins(int x,int y,int d)
18 {
19     len++;
20     a[len].x=x;a[len].y=y;a[len].d=d;
21     a[len].next=first[x];first[x]=len;
22 }
23 
24 void init()
25 {
26     len=0;
27     memset(first,0,sizeof(first));
28     for(int i=1;i<=n-m;i++)
29     {
30         int k,x,d;
31         scanf("%d",&k);
32         for(int j=1;j<=k;j++)
33         {
34             scanf("%d%d",&x,&d);
35             ins(i,x,d);ins(x,i,d);
36         }
37     }
38     for(int i=n-m+1;i<=n;i++) scanf("%d",&w[i]);
39     for(int i=1;i<=n-m;i++) v[i]=0;
40     for(int i=n-m+1;i<=n;i++) v[i]=1;
41 }
42 
43 void dfs(int x,int fa)
44 {
45     for(int i=first[x];i;i=a[i].next)
46     {
47         int y=a[i].y;
48         if(y!=fa)
49         {
50             if(y>=n-m+1) cost[y]=-a[i].d+w[y];
51             else cost[y]=-a[i].d;
52             dfs(y,x);
53         }
54     }
55 }
56 
57 void dp(int x,int fa)
58 {
59     for(int i=first[x];i;i=a[i].next)
60     {
61         int y=a[i].y,V=v[y],W=cost[y];
62         if(y==fa) continue;
63         
64         for(int j=0;j<=n;j++) f[y][j]=f[x][j];
65         dp(y,x);
66         
67         // 泛化物品(f[x])加普通物品(节点y:V=v[y],W=cost[y])
68         // 初始化f[y]:f[y][j]=max(f[y][j],f[y][j-V]+W);
69         
70         // 泛化物品(f[x])与泛化物品(f[y])合并(f[x]与f[y]存在交集)
71         // f[x][j]=maxx(f[x][j],f[y][j+V]);
72         for(int j=V;j<=n-V;j++)
73             f[x][j]=maxx(f[x][j],f[y][j-V]+W);//加普通物品y应放在dp(y)后,因为f[y]是表示y可选可不选的,如果先压进去就必须选。
74     }
75 }
76 
77 
78 
79 int main()
80 {
81     freopen("a.in","r",stdin);
82     // freopen("a.out","w",stdout);    
83     scanf("%d%d",&n,&m);
84     init();
85     dfs(1,0);
86     for(int i=1;i<=n;i++) 
87         for(int j=0;j<=n;j++) 
88             if(j==0) f[i][j]=0;
89             else f[i][j]=-Inf;
90     dp(1,0);
91     int ans=0;
92     for(int i=n;i>=1;i--)
93         if(f[1][i]>=0) {printf("%d\n",i);return 0;}
94     printf("0\n");
95     return 0;
96 }

 

posted @ 2016-08-18 14:48 拦路雨偏似雪花 阅读( ...) 评论( ...) 编辑 收藏
深度学习是机器学习的一个子领域,它基于人工神经络的研究,特别是利用多层次的神经络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经络(Neural Networks)**:深度学习的基础是人工神经络,它是由多个层组成的络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经络(Feedforward Neural Networks)**:这是最常见的神经络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经络(Convolutional Neural Networks, CNNs)**:这种络特别适合处理具有格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经络(Recurrent Neural Networks, RNNs)**:这种络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗络(Generative Adversarial Networks, GANs)**:由两个络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经络中用于添加非线性,使得络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值