2016夏季练习——dp
2016-07-09 23:48
260 查看
来源:HDU1520
首先第一个是知道了我们的dp原来是有可能用搜索来进行推演和解释的,之前一直以为是递推的。
第二个树形dp的确是第一次看见,所以还是需要多多学习。
先来解释一下这个题目:
选一个树的非联通最大子集,其中数据是有权值
代码:
//tree-like dp
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 6005;
int con[MAXN];
vector<int> tree[MAXN];
int v[MAXN];
int dp[MAXN][2];
bool vis[MAXN];
int n;
void dfs(int root){
vis[root]=1;
dp[root][0]=0;
dp[root][1]=con[root];
int p;
for(int i=0;i<tree[root].size();i++){
p=tree[root][i];
if(vis[p]) continue;
dfs(p);
dp[root][0]+=max(dp[p][1],dp[p][0]);
dp[root][1]+=dp[p][0];
}
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
for(int i=1;i<=n;i++){
scanf("%d",con+i);
}
memset(v,0,sizeof(v));
int fa,son;
while(scanf("%d%d",&son,&fa)){
if(fa==0&&son==0) break;
tree[fa].push_back(son);
v[son]++;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
if(!v[i]){
memset(vis,0,sizeof(vis));
dfs(i);
cout<<max(dp[i][0],dp[i][1])<<endl;
break;
}
}
return 0;
}
首先第一个是知道了我们的dp原来是有可能用搜索来进行推演和解释的,之前一直以为是递推的。
第二个树形dp的确是第一次看见,所以还是需要多多学习。
先来解释一下这个题目:
选一个树的非联通最大子集,其中数据是有权值
代码:
//tree-like dp
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 6005;
int con[MAXN];
vector<int> tree[MAXN];
int v[MAXN];
int dp[MAXN][2];
bool vis[MAXN];
int n;
void dfs(int root){
vis[root]=1;
dp[root][0]=0;
dp[root][1]=con[root];
int p;
for(int i=0;i<tree[root].size();i++){
p=tree[root][i];
if(vis[p]) continue;
dfs(p);
dp[root][0]+=max(dp[p][1],dp[p][0]);
dp[root][1]+=dp[p][0];
}
}
int main(){
while(scanf("%d",&n)!=EOF&&n){
for(int i=1;i<=n;i++){
scanf("%d",con+i);
}
memset(v,0,sizeof(v));
int fa,son;
while(scanf("%d%d",&son,&fa)){
if(fa==0&&son==0) break;
tree[fa].push_back(son);
v[son]++;
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
if(!v[i]){
memset(vis,0,sizeof(vis));
dfs(i);
cout<<max(dp[i][0],dp[i][1])<<endl;
break;
}
}
return 0;
}
相关文章推荐
- 5-20 打印九九口诀表 (15分)
- 【MyBatis框架】MyBatis入门程序第一部分
- LevelDB源码分析之内存管理类arena
- SQL Server 2016正式版安装(超多图)
- 开源软件与知识产权
- VIJOS P1889 天真的因数分解
- ScrollView等控件的代理协议
- C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
- 【源码学习之spark core 1.6.1 各种部署模式所使用的的TaskSceduler及SchedulerBackend】
- mysql++ 官方文档阅读简略摘要
- XML基础
- Android6.0给开发者带来哪些影响
- smarty简单模板变量输出方法[原创]_php实例_脚本之家
- IOS 最强大的模糊搜索
- PHP调用OpenOffice实现word转PDF
- CSS自适应布局(包括两边宽度固定中间宽度自适应与中间宽度固定两边宽度自适应)
- 【源码学习之spark core 1.6.1 standalone模式下的作业提交】
- 类与继承(一)
- 数据库分表总结
- m_pDC->GetSafeHdc()的思考