当前位置: 首页 > news >正文

NOIP2017提高组.宝藏

题目

529. 宝藏
在这里插入图片描述

算法标签: 状态压缩 d p dp dp, 位运算, 贪心

思路

在这里插入图片描述

代价等于 长度 × 当前点的深度 长度 \times 当前点的深度 长度×当前点的深度, 求代价的最小值, 直接想法是 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示整个集合状态是 i i i, 最后一层状态是 j j j, 因为最后一层状态也要取决于上一层状态, 上一层状态是 k k k的最小代价, 但是时间复杂度会爆炸, 空间也会爆炸, 需要优化

算状态的时候只能和前一层相连, 只能连向上一层的点, 但是我们考虑是否可以连到前面所有的点, 因为需要连最短边, 因此其实也是连接到 i − 1 i - 1 i1层的点, 也就不需要连接到上一层的点, 因此我们重新考虑状态表示

f [ i ] [ j ] f[i][j] f[i][j]选择的点的集合是 i i i并且树的高度是 j j j的所有方案的最小代价, 按照最后一层的状态进行集合的划分, 假设最后一层的状态是 k k k, f [ i ] [ j ] = m i n ( f [ i ⊕ k ] [ j − 1 ] ) + w f[i][j] = min(f[i \oplus k][j - 1]) + w f[i][j]=min(f[ik][j1])+w

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 12, M = 1 << N, INF = 0x3f3f3f3f;

int n, m;
int d[N][N], f[M][N];
int g[M];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	cin >> n >> m;
	memset(d, 0x3f, sizeof d);
	for (int i = 0; i < n; ++i) d[i][i] = 0;

	for (int i = 0; i < m; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		u--, v--;
		d[u][v] = d[v][u] = min(d[u][v], w);
	}

	// 统计状态i能转移到的状态
	for (int i = 0; i < 1 << n; ++i) {
		for (int j = 0; j < n; ++j) {
			if (i >> j & 1) {
				for (int k = 0; k < n; ++k) {
					if (d[j][k] != INF) g[i] |= 1 << k;
				}
			}
		}
	}

	memset(f, 0x3f, sizeof f);
	for (int i = 0; i < n; ++i) f[1 << i][0] = 0;

	for (int i = 1; i < 1 << n; ++i) {
		for (int j = i - 1 & i; j; j = j - 1 & i) {
			if ((g[j] & i) == i) {
				int pre = i ^ j, cost = 0;

				for (int k = 0; k < n; ++k) {
					if (pre >> k & 1) {
						int val = INF;
						for (int l = 0; l < n; ++l) {
							if (j >> l & 1) val = min(val, d[k][l]);
						}
						cost += val;
					}
				}

				for (int k = 1; k < n; ++k) f[i][k] = min(f[i][k], f[j][k - 1] + k * cost);
			}
		}
	}

	int res = INF;
	for (int i = 0; i < n; ++i) res = min(res, f[(1 << n) - 1][i]);

	cout << res << "\n";
	return 0;
}

相关文章:

  • 【强化学习】Deep Reinforcement Learning: A Survey综述学习
  • fast_pow(),c语言幂函数
  • 性能比拼: Go(Gin) vs Python(Flask)
  • 按规则批量修改 txt/html/json/xml/csv/记事本等文本文件内容
  • 【企业级Web应用中的文件下载处理:从S3预签名URL到压缩状态管理】
  • 24、网络编程基础概念
  • Appscan下载及安装教程
  • Vue3中的Icon理方案
  • OCR第三个方案:PP-OCRv4的初步探索
  • 2015年国家队选拔赛试题改编题
  • 基于卷积神经网络的眼疾识别系统,resnet50,efficentnet(pytorch框架,python代码)
  • 什么是开发者社区(Developer Communities)?
  • OCCT(2)Windows平台编译OCCT
  • 【大模型】微调一个大模型需要多少 GPU 显存?
  • 论文阅读《P​roximal Curriculum for Reinforcement Learning Agents》——提升智能体学习速度的
  • 11 配置Hadoop集群-免密登录
  • OpenBMC:BmcWeb 处理http请求3 字典树查找节点
  • 搜索算法------深度优先搜索
  • 解锁AI潜能:模型上下文协议(MCP)的革新与应用
  • 原生应用与Web应用的融合演进:现代跨平台开发指南
  • 网站制作的公司/提升关键词排名有哪些方法
  • 软件开发培训班哪个好/seo
  • 进一步强化网站建设/艺考培训
  • ps做网站的效果图/竞价广告
  • wordpress 未分类/windows优化大师的作用
  • 兰州产品营销网站建设/北京seo公司助力网络营销