题目链接

题目

题目描述

Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way every two atoms perform when collided and the power every two atoms can produce.

You are to write a program to make it most powerful, which means that the sum of power produced during all the collides is maximal.

输入描述

There are multiplecases. The first line of each case has an integer N (2 <= N <= 10), whichmeans there are N atoms: A1, A2, ... , AN.Then N lines follow. There are N integers in each line. The j-th integer on thei-th line is the power produced when Ai and Aj collidewith Aj gone. All integers are positive and not larger than 10000.The last case isfollowed by a 0 in one line.There will be no morethan 500 cases including no more than 50 large cases that N is 10.

输出描述

Output the maximalpower these N atoms can produce in a line for each case.

示例1

输入

2
0 4
1 0
3
0 20 1
12 0 1
1 10 0
0

输出

4
22

题解

知识点:状压dp。

经典的TSP问题。这道题由于可以随便找一个 \(A\) 撞随便一个 \(B\) ,所以没必要记录上一个原子是啥,设 \(dp[st]\) 表示状态 \(st\) 的最大值。由于 \(A\) 撞 \(B\) 只会消失 \(B\) 并得到 \((A,B)\) 的能量,因此 \(A\) (编号 \(i\) )要满足状态中没用过,\(B\) (编号 \(j\) )满足状态中用过,于是有转移方程:

\[dp[st] = max(dp[st], dp[st \wedge (1 << (j - 1))] + g[i][j])
\]

用记忆化搜索也能写。

时间复杂度 \(O(n^22^n)\)

空间复杂度 \(O(2^n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int n;
int g[17][17];
int dp[1 << 11]; int dfs(int st) {
if (~dp[st]) return dp[st];
for (int i = 1;i <= n;i++) {
if ((st >> (i - 1)) & 1) continue;
for (int j = 1;j <= n;j++) {
if (!((st >> (j - 1)) & 1)) continue;
dp[st] = max(dp[st], dfs(st ^ (1 << (j - 1))) + g[i][j]);
}
}
return dp[st];
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
while (cin >> n, n) {
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
cin >> g[i][j];
memset(dp, -1, sizeof(dp));
int ans = 0;
dp[0] = 0;
for (int i = 1;i <= n;i++) {
ans = max(ans, dfs(((1 << n) - 1) ^ (1 << (i - 1))));
}
cout << ans << '\n';
}
return 0;
}

NC15832 Most Powerful的更多相关文章

  1. HDOJ 3593 The most powerful force

    树形DP / 泛化物品的背包...可以去看09年徐持衡论文<浅谈几类背包问题> The most powerful force Time Limit: 16000/8000 MS (Jav ...

  2. CodeForces 86D Powerful array(莫队+优化)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...

  3. hdu 4150 Powerful Incantation

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4150 Powerful Incantation Description Some dangerous ...

  4. D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

    莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...

  5. 10+ powerful debugging tricks with Visual Studio

    10+ powerful debugging tricks with Visual Studio Original link : http://www.codeproject.com/Articles ...

  6. zoj 3471 Most Powerful

    题目链接:zoj 3471 Most Powerful  作者:jostree 转载请说明出处 很经典的状态dp,使用i的二进制位表示粒子的状态,0表示存在,1表示不存在.dp[i]表示在状态i的情况 ...

  7. zoj 3471 Most Powerful(状态压缩dp)

    Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These ato ...

  8. codefroce D. Powerful array[初识块状数组]

    codefroce D. Powerful array[初识块状数组] 由于是初始所以,仅仅能先用别人的分析.囧... 题目: 给定一个数列:A1, A2,--,An,定义Ks为区间(l,r)中s出现 ...

  9. D. Powerful array

    D. Powerful array 题意 给定一个数列:a[i] (1<= i <= n) K[j]表示 在区间 [l,r]中j出现的次数.有t个查询,每个查询l,r,对区间内所有a[i] ...

  10. The new powerful SQL executing schedule monthly or weekly in DB Query Analyzer 7.01

    1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainland. ...

随机推荐

  1. 08-Shell计算命令

    1.expr命令 expr (evaluate expressions 的缩写),译为"表达式求值".Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计 ...

  2. 海思Hi35xx uboot启动分析总结

    前言 在嵌入式linux设备中,uboot的最终目的就是启动kernel.对于uboot而言,没有人把它引导起来,所以uboot首先需要把自己加载起来,然后再去引导kernel的启动,这也就可以大致的 ...

  3. oceanbase部署维护命令学习

    oceanbase部署维护命令学习 背景 之前学习过TIDB数据库, 最近又准备学习一下Oceanbase数据库 发现其实两者还是比较相似的. 比较大的区别在于. TiDB是完全开源的, 并且比较明确 ...

  4. [转帖]一文理清 TiDB 与 MySQL 中的常用字符集及排序规则

    https://tidb.net/blog/0c5b6025   1.1. 字符集与编码规则 字符集(character set)即为众多字符的集合.字符集为每个字符分配一个唯一的 ID,称为 &qu ...

  5. [转帖]InnoDB表聚集索引层高什么时候发生变化

    导读 本文略长,主要解决以下几个疑问 1.聚集索引里都存储了什么宝贝 2.什么时候索引层高会发生变化 3.预留的1/16空闲空间做什么用的 4.记录被删除后的空间能回收重复利用吗 1.背景信息 1.1 ...

  6. 【转帖】Seccomp、BPF与容器安全

    语音阅读2022-06-30 20:26 本文详细介绍了关于seccomp的相关概念,包括seccomp的发展历史.Seccomp BPF的实现原理已经与seccomp相关的一些工具等.此外,通过实例 ...

  7. github-keydb 知识

    https://github.com/Snapchat/KeyDB KeyDB is now a part of Snap Inc! Check out the announcement here R ...

  8. Systemd设置ulimit的方式与方法

    Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为syste ...

  9. CentOS8 的容器运行时解决中文乱码问题的一个思路

    首先说明一下 CentOS7和CentOS8关于locale语言文件的位置是不一样的. Docker pull centos 拉取下来的镜像 一般是不带中文语言包的. 简单方法是在 CentOS之后安 ...

  10. NOI2023 游记

    不完全按时间顺序写.记录 NOI 的一些琐事. 从 XDFZ 坐大巴 5 个小时来到成七.第一眼看到的是一个放着 NOI 牌子的台阶,还有一个签名墙.好像在我们之前到的人不太多? 用中英双语签名(冷月 ...