Most Powerful
2015-08-19 15:57
183 查看
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471
题意:有n种气体,给定一个矩阵,表示a[i]和a[j]气体相撞所产生的能量,并且,碰撞之后,a[j]这种气体会消失,求这些气体碰撞后能产生的最大能量和。
类型:状态压缩,dp
思路:这个题目和上一个状压的题目很类似,只是增加了一个条件,a[i]和a[j]气体碰撞之后,a[j]这种气体会消失。所以多了一层循环。
代码:
题意:有n种气体,给定一个矩阵,表示a[i]和a[j]气体相撞所产生的能量,并且,碰撞之后,a[j]这种气体会消失,求这些气体碰撞后能产生的最大能量和。
类型:状态压缩,dp
思路:这个题目和上一个状压的题目很类似,只是增加了一个条件,a[i]和a[j]气体碰撞之后,a[j]这种气体会消失。所以多了一层循环。
代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<string.h> #include<stdlib.h> #define N 12 using namespace std; int a[N][N]; int dp[1<<11]; int main() { int n; while(scanf("%d",&n)) { if(n==0) break; for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&a[i][j]); memset(dp,0,sizeof(dp)); int st=(1<<n);//用二进制表示气体的碰撞情况,1表示碰撞,0表示未碰撞 for(int s=0; s<=st; s++)//每种状态的更新 { for(int i=0; i<n; i++) { if(s&(1<<i))continue;//如果该气体已经碰撞,则不参与更新 for(int j=0; j<n; j++) { if(i==j||(s&(1<<j)))//如果是同一种气体,或者该气体已经碰撞,则不参与更新 continue; dp[s|(1<<j)]=max(dp[s|(1<<j)],dp[s]+a[i][j]);//更新为更大的能量 } } } int maxn=0; for(int i=0;i<=st;i++) { maxn=max(dp[i],maxn);//找到能产生的最大的能量 } cout<<maxn<<endl; } return 0; }
相关文章推荐
- linux 命令 - 剪切或改名命令 mv
- bzoj1047
- Jquery 弹出新窗体
- [Leetcode] Word Break I
- openvz 去掉venet
- c++ primer plus 第八章《编程题8.8.7》
- android休眠之后 定时任务TimerTask不生效
- 反射的详解与使用
- grep命令常用的15招
- HNOI 2002 营业额统计
- Java内存泄露例子
- 1095. Cars on Campus (30)
- 学习笔记之树的镜像
- 腾讯电面——C/C++基础之关键字
- 退出指南(4) - 如何选择一个公司
- 问题: ActivityManager: Warning: Activity not started, its current task has been brought to the front
- IOS第11天(2:UIPickerView自定义国旗选择)
- Csharp: read excel file using Open XML SDK 2.5
- 使用Kettle抽取MongoDB数据到Oracle
- hdu 1405