紫书 例题 9-13 UVa 1220 (最大独立子集)
2024-08-31 15:33:35
这里的状态定义的非常的巧妙,d(i, 1)表示以i为根节点且选i的子树的最大独立子集
d(i, 0)表示以i为根节点且不选i的子树的最大独立子集
d(i, 1) = sum{ d(v, 0) | v是i的儿子}
d(i, 0) = sum{ max(d(v, 0), d(v, 1)) | v是i的儿子}
答案为 max(d(0, 0), d(0, 1))
至于唯不唯一,很好推,当子树中有一个是不唯一的,那么当前节点就不唯一,或者有两个子树答案是一样的,也是不唯一的。
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
const int MAXN = 212;
vector<int> son[MAXN];
int cnt, d[MAXN][2], f[MAXN][2], n;
map<string, int> id;
int ID(string s)
{
if(!id.count(s)) id[s] = cnt++;
return id[s];
}
int dp(int u, int k)
{
f[u][k] = 1; d[u][k] = k;
REP(i, 0, son[u].size())
{
int v = son[u][i];
if(k == 1)
{
d[u][k] += dp(v, 0);
if(!f[v][0]) f[u][k] = 0;
}
else
{
d[u][k] += max(dp(v, 1), dp(v, 0));
if(d[v][1] == d[v][0]) f[u][k] = 0;
if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
if(d[v][1] < d[v][0] && !f[v][0]) f[u][k] = 0;
}
}
return d[u][k];
}
int main()
{
string s, s2;
while(cin >> n >> s)
{
cnt = 0;
id.clear();
REP(i, 0, n) son[i].clear();
ID(s);
REP(i, 0, n - 1)
{
cin >> s >> s2;
son[ID(s2)].push_back(ID(s));
}
printf("%d ", max(dp(0, 0), dp(0, 1)));
bool ok = false;
if(d[0][1] > d[0][0] && f[0][1]) ok = true;
if(d[0][1] < d[0][0] && f[0][0] ) ok = true;
printf("%s\n", ok ? "Yes" : "No");
}
return 0;
}
最新文章
- PHP基础知识第二趴
- 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)
- mongo 学习笔记
- 334. Increasing Triplet Subsequence My Submissions Question--Avota
- python基础(三)
- 清除Android工程中没用到的资源(转)
- Java之路——敬JAVA初学者(作者:MoMo)
- c++ 调用dl里的导出类
- 深度学习:Keras入门(一)之基础篇
- sqlmap命令
- 显示 Ubuntu 11.10 的 终端窗口
- c# throw和throw ex
- http/1.0/1.1/2.0与https的比较
- ActiveMQ 填坑记
- P1099 树网的核
- 23.读懂 ECMAScript 规格
- Latex中如何设置字体颜色(3种方式)
- mysql-mmm
- APUE4.4设置用户ID和设置组ID &;&; 4.5文件访问权限
- iOS开发-UIApplication和App启动状态
热门文章
- hadoop-09-安装资源上传
- [Angular + TsLint] Disable directive selector tslint error
- PHP第九课 正則表達式在PHP中的使用
- 在java项目中怎样利用Dom4j解析XML文件获取数据
- 【LeetCode-面试算法经典-Java实现】【129-Sum Root to Leaf Numbers(全部根到叶子结点组组成的数字相加)】
- 51nod-1322: 关于树的函数
- 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求
- java9新特性-8-语法改进:钻石操作符(Diamond Operator)使用升级
- HBase框架基础(一)
- 使用tinyxml2库解析xml