Most Powerful (zoj 3471 状压dp 点集配对)
来源:互联网 发布:儿童阅读软件下载 编辑:程序博客网 时间:2024/05/17 13:10
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
Author: GAO, Yuan
Contest: ZOJ Monthly, February 2011
题意:n中元素,现在两种不同的元素之间可以发生反应并且放出能量,其中一种元素随之消失,现在给出每两种元素之间发生反应产生的能量值关系,求使得这n种元素反应完后能得到的最大能量值。
思路:n的范围比较小,可以想到状态压缩,dp[s]表示元素集合s反应后能得到的最大能量值,那么状态转移方程为dp[s]=max(dp[s],dp[s^(1<<j)]+a[i][j])。
代码:
#include <iostream>#include <functional>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define pi acos(-1.0)#define eps 1e-6#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define FRE(i,a,b) for(i = a; i <= b; i++)#define FREE(i,a,b) for(i = a; i >= b; i--)#define FRL(i,a,b) for(i = a; i < b; i++)#define FRLL(i,a,b) for(i = a; i > b; i--)#define mem(t, v) memset ((t) , v, sizeof(t))#define sf(n) scanf("%d", &n)#define sff(a,b) scanf("%d %d", &a, &b)#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)#define pf printf#define DBG pf("Hi\n")typedef long long ll;using namespace std;#define INF 0x3f3f3f3f#define mod 1000000009const int maxn = 1005;const int MAXN = 2005;const int MAXM = 200010;const int N = 1005;int a[11][11],dp[(1<<10)+10],n;void solve(){ int m=1<<n; memset(dp,0,sizeof(dp)); for (int s=0;s<m;s++) { for (int i=0;i<n;i++) { if (s&(1<<i)) { for (int j=0;j<n;j++) { if (i==j) continue; //这一句千万不要忘记了! if (s&(1<<j)) { dp[s]=max(dp[s],dp[s^(1<<j)]+a[i][j]); } } } } }}int main(){//#ifndef ONLINE_JUDGE// freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);//#endif int i,j; while (scanf("%d",&n),n) { for (i=0;i<n;i++) for (j=0;j<n;j++) scanf("%d",&a[i][j]); solve(); printf("%d\n",dp[(1<<n)-1]); } return 0;}
- Most Powerful (zoj 3471 状压dp 点集配对)
- ZOJ 3471 Most Powerful(状压DP)
- ZOJ 3471 Most Powerful(状压dp)
- ZOJ 3471 Most Powerful(状压DP)
- ZOJ 3471 Most Powerful(状压DP)
- Most Powerful - ZOJ 3471 状压dp
- [ZOJ 3471] Most Powerful · 状压DP
- zoj 3471 Most Powerful 【状压DP】
- ZOJ 3471 Most Powerful (状压DP)
- ZOJ 3471 Most Powerful (状压dp)
- ZOJ 3471 Most Powerful 状压dp
- ZOJ 4257--Most Powerful(状压dp)
- zoj 3471 Most Powerful 状压dp(简单)
- zoj 3471 Most Powerful(状压)
- ZOJ 3471Most Powerful(状态压缩DP)
- zoj 3471 Most Powerful(状态压缩DP)
- zoj 3471 Most Powerful (状态压缩dp~)
- zoj 3471 Most Powerful //状态压缩DP
- AfxBeginThread创建用户界面线程
- TCP/IP、Http、Socket的区别
- 设置Java类路径的注意事项
- web的负载均衡 集群高可用(HA)解决方案
- Java加载类路径下资源
- Most Powerful (zoj 3471 状压dp 点集配对)
- 构造函数
- SpringMVC 常用注解简介
- AHB和APB的学习
- 所学知识
- 94. Binary Tree Inorder Traversal
- ns2输出调试信息及trace
- 解决ubuntu14.04使用Quartus II无法调用Modelsim-Altera的问题
- MS WORD 通配符查找 正则表达式