Most Powerful


Time Limit: 2 Seconds      Memory Limit: 65536 KB

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

解法1:

所有的原子组成一个集合,每次从中选取两个点,选择一个攻击点,选择一个被攻击点,

d[s]=max(d[s],d[s ^ (1<<j)] +a[i][j]);

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define maxn 10
using namespace std;
int d[<<]; //表示到达状态s时产生的最大能量
int a[][];
int n;
void init()
{
memset(d,,sizeof(d));
}
void solve()
{
for(int s=;s<(<<n);s++)
{
d[s]=;
for(int i=;i<n;i++)
if(s & (<<i))
{
for(int j=;j<n;j++)
if(s & (<<j))
{
if(i==j)
continue;
d[s]=max(d[s],d[s ^ (<<j)]+a[i][j]); }
}
} }
int main()
{
while(~scanf("%d",&n))
{
if(n==)
break;
init();
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
scanf("%d",&a[i][j]);
}
solve();
int ans=;
// for(int i=0;i<(1<<n);i++)
// cout<<d[i]<<" ";
//cout<<endl;
//ans=max(ans,d[i]);
printf("%d\n",d[(<<n)-]);
}
return ;
}

解法2:

假设一个数,第i位表示第i个原子是否被灭掉,如果被灭掉则为1,没被灭掉为0,那么所有状态都可以用2^n范围内的数来表示。则初始状态为0,即所有原子都没有消失

  令dp[i]表示达到状态 i 时所产生的最大能量,则答案就是从0~(1<<n)所有状态里释放的最大的那个能量。 需要枚举所有状态。

  假设当前状态是s,从1~n里边枚举主动碰撞的原子 i ,和被动碰撞被消灭掉的原子 j ,则

  dp[s | (1<<j)] = max{dp[s | (1<<j)] , dp[s] + A[i][j]};

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define maxn 10
using namespace std;
int d[<<]; //表示到达状态s时产生的最大能量
int a[][];
int n;
void init()
{
memset(d,,sizeof(d));
}
void solve()
{
for(int s=;s<(<<n);s++)
{
for(int i=;i<n;i++)
{
if( ! (s & (<<i)) ) //不知为何写成(if( (s & (1 << i)) ))也能过
{
for(int j=;j<n;j++)
{
if(i==j)
continue;
if(s & (<<j))
continue;
d[s |(<<j)] = max(d[s | (<<j)],d[s]+a[i][j]);
}
}
}
} }
int main()
{
while(~scanf("%d",&n))
{
if(n==)
break;
init();
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
scanf("%d",&a[i][j]);
}
solve();
int ans=;
for(int i=;i<(<<n);i++)
ans=max(ans,d[i]);
printf("%d\n",ans); }
return ;
}

zoj 3471(状态压缩DP,类似于点集配对)的更多相关文章

  1. zoj 3471(状态压缩)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257 dp[state]表示当前状态为state时的所能获得的最大值 ...

  2. ZOJ 3471 【状态压缩DP】

    题意: 有n种化学物质,他们彼此反应会有一种消失并释放出能量. 给出矩阵,第i行j列代表i和j反应j消失释放的能量. 求最大释放多少能量. 思路: 状态压缩DP,我是这么想的. 利用二进制0代表该物质 ...

  3. ZOJ 2563 Long Dominoes(状态压缩DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1563 题目大意:在h*w的矩阵里铺满1*3的小矩阵,共有多少种方法 ...

  4. poj 3311 Hie with the Pie(状态压缩dp)

    Description The Pizazz Pizzeria prides itself or more (up to ) orders to be processed before he star ...

  5. Travelling(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others ...

  6. Gym-101915D Largest Group 最大独立集 Or 状态压缩DP

    题面题意:给你N个男生,N个女生,男生与男生之间都是朋友,女生之间也是,再给你m个关系,告诉你哪些男女是朋友,最后问你最多选几个人出来,大家互相是朋友. N最多为20 题解:很显然就像二分图了,男生一 ...

  7. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  8. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  9. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

随机推荐

  1. UVA10673 上下界问题

    #include <iostream> #include<cstdio> using namespace std; #define LL long long LL a,b,m, ...

  2. CodeForces 592C The Big Race

    公倍数之间的情况都是一样的,有循环节. 注意min(a,b)>t的情况和最后一段的处理.C++写可能爆longlong,直接Java搞吧...... import java.io.Buffere ...

  3. MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate

    一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...

  4. 个人网站开发***云服务器+Linux+域名***

    作为一个改变世界的程序猿,我们不应该只会埋头写程序修bug还得会点别的, 当然如果要是自己搞个网站玩玩,既可以锻炼技术,没事也可以和圈外的朋友吹吹 牛.因为水平有限,就弄一些最基础的看看喽,不喜勿喷. ...

  5. java验证身份证号码是否有效源代码

    原文:http://www.open-open.com/code/view/1420373343171 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ...

  6. VB和VB.NET有什么区别

    作为VB6.0的后续版本,VB.NET更加稳定,而且完全面向对象.也许你还记得,VB6.0部支持继承.重载和接口,所以不是真正面向对象的.而VB.NET则支持这些面向对象特性.VB6.0有两个薄弱环节 ...

  7. Deepin-快捷方式设置

    Linux无非就是命令命令命令,而不是点点点,下面介绍快捷方式 然后点击 最后找到快捷方式(鼠标滚轮下滑) 快捷方式自个看着修改

  8. #Virtual hosts #Include conf/extra/httpd-vhosts.conf 开启就不能启动apache

    #Virtual hosts#Include conf/extra/httpd-vhosts.conf我只要把其中任何一个开启就是吧#去掉就启动不了apache.怎么回事error.log是这样的ht ...

  9. 【spring+websocket的使用】

    一.spring配置文件Java代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...

  10. 3 Angular 2 快速上手启动项目Demo

    Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是雷锋与雷峰塔的区别,想要运行Angular2需要安装一些第三方依赖,不会像Angular1.x那样, ...