zoj3471 状压dp入门
来源:互联网 发布:数学自主招生 知乎 编辑:程序博客网 时间:2024/06/14 08:52
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.
Input
There are multiple cases. The first line of each case has an integer N (2 <= N <= 10), which means there are N atoms: A1, A2, … , AN. Then N lines follow. There are N integers in each line. The j-th integer on the i-th line is the power produced when Ai and Aj collide with Aj gone. All integers are positive and not larger than 10000.
The last case is followed by a 0 in one line.
There will be no more than 500 cases including no more than 50 large cases that N is 10.
Output
Output the maximal power these N atoms can produce in a line for each case.
Sample Input
2
0 4
1 0
3
0 20 1
12 0 1
1 10 0
0
Sample Output
4
22
代码:
#include <iostream>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <map>#include <vector>#define MST(s,q) memset(s,q,sizeof(s))#define INF 0x3f3f3f3f#define MAXN 1000005#define Lchild id<<1#define Rchild (id<<1)+1using namespace std;int dp[10000];int x[15][15];int DP(int n) { MST(dp, 0); for (int i = 0; i < (1 << n); i++) { // 二进制i中 1表示不存在,0表示存在 for (int j = 1; j <= n; j++) { if (i & (1 << (j - 1))) continue; // j已经消失 for (int k = 1; k <= n; k++) { // 用k撞j,k消失 if (j == k) continue; if (i & (1 << (k - 1))) continue; // k不在状态i中存在 dp[i | (1 << (k - 1))] = max(dp[i | (1 << (k - 1))], dp[i] + x[j][k]); } } } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dp[(1 << n) - 1 - (1 << (i - 1))]); return ans;}int main() { int N; while (cin >> N && N) { for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) scanf("%d", &x[i][j]); printf("%d\n", DP(N)); }}
- zoj3471 状压dp入门
- ZOJ3471 MostPowerful 状压DP
- ZOJ3471【状压DP】
- ZOJ3471---Most Powerful(状压dp)
- zoj3471 Most Powerful 状压dp
- zoj3471 Most Powerful 状压dp
- zoj3471 dp 状态压缩
- 状态压缩DP(ZOJ3471)
- zoj3471 一维状压dp
- ZOJ3471 状态压缩DP
- zoj3471
- ZOJ3471
- zoj3471
- ZOJ3471 Most Powerful,状态压缩DP
- zoj3471 Most Powerful(状态压缩dp)
- ZOJ3471-Most Powerful-状态压缩dp
- ZOJ3471——Most Powerful(状态压缩DP)
- 状态压缩DP——zoj3471 最大能量
- RabbitMQ学习笔记1-"Hello World!"simple模型
- 翻转二叉树
- GDOI2017模拟第三轮总结
- 软件光栅化渲染器(一)
- 图片缩放导致的相关问题
- zoj3471 状压dp入门
- 线程池高级
- 2017-4-23:学习笔记(正则表达式+API)
- sonar+mysql+eclipse搭建本地代码分析工具
- 非常适用的Sourceinsight插件,提高效率【强力推荐】
- openwebflow----基于Activiti的工作流引擎扩展
- Linux基础之swap分区
- web 学习笔记3-JavaScript
- Comet基于 HTTP 长连接的“服务器推”技术