UVA - 10604 Chemical Reaction 记忆化搜索
来源:互联网 发布:网络舆情监控系统开源 编辑:程序博客网 时间:2024/05/19 14:52
题目大意:给出m个药品,m不大于7,两种药品合在一起可以发生化学反应,反应有吸热的也有放热的,两种药品反映后还会生成另一种药品,求将k中药品进行合并,计算出最小的热量
解题思路:本来用二进制法表示药品的状态的,发现超时了,于是便参考了一下别人的思路,竟然使用6维数组表示状态,发现确实可以,因为药品列别不大于7,那么6维数组的大小就不会太大了,每一个维度放一种药品的数量,这样就可以计算了,具体看代码
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 1<<30 const int N=12; bool vis[N][N][N][N][N][N]; int tube[N],data[N][N][2],map[N][N][N][N][N][N]; int dp(int,int,int,int,int,int); int main() { int t,n,m; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); memset(map,0,sizeof(map)); memset(tube,0,sizeof(tube)); scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d%d",&data[i][j][0],&data[i][j][1]); } } scanf("%d",&m); for(int i=0;i<m;i++) { int temp; scanf("%d",&temp); tube[temp]++; } printf("%d\n",dp(tube[1],tube[2],tube[3],tube[4],tube[5],tube[6])); char use[5];scanf("%s",use); } return 0; }int dp(int a,int b,int c,int d,int e,int f) { bool &flag=vis[a][b][c][d][e][f]; int &res=map[a][b][c][d][e][f]; if(flag) return res; else { res=INF; int m[7]={0,a,b,c,d,e,f}; for(int i=1;i<=6;i++) { for(int j=1;j<=6;j++) { if(i==j && m[i] < 2) continue; if(m[i]&&m[j]) { m[i]--;m[j]--;m[data[i][j][0]]++; int temp=dp(m[1],m[2],m[3],m[4],m[5],m[6]); if(temp!=INF) res=min(res,temp+data[i][j][1]); m[i]++;m[j]++;m[data[i][j][0]]--; } } } flag=1; if(res==INF) res=0; return res; } }
0 0
- UVA - 10604 Chemical Reaction 记忆化搜索
- uva 10604 Chemical Reaction 记忆化搜索
- UVA 10604--Chemical Reaction+记忆化搜索
- uva 10604 - Chemical Reaction (记忆化搜索)
- UVA - 10604Chemical Reaction(记忆化搜索)
- UVA - 10604 Chemical Reaction(6维dp+记忆化搜索)
- uva 10604 Chemical Reaction
- UVA - 10604 Chemical Reaction
- uva 10604 - Chemical Reaction
- uva 10604 - Chemical Reaction
- UVA 10604 - Chemical Reaction
- UVA - 10604 Chemical Reaction
- UVA - 10604 Chemical Reaction
- uva 10604Chemical Reaction
- uva 10604 Chemical Reaction (DP)
- Chemical Reaction - UVa 10604 dp
- UVA 10604 - Chemical Reaction (状态压缩)
- dp(UVa 10604 - Chemical Reaction)
- windows下生成MTK手机串号
- JSON解析(序列化和反序列化)
- JAVA语言的特点
- 周游列国
- UML类图实例----PPT播放和笔记同步系统
- UVA - 10604 Chemical Reaction 记忆化搜索
- EXCEL中如何提取身份证出生日期和性别信息以及检验身份证号码的正确性
- 面向对象的原则
- iOS沙盒目录解析
- Go by Example: If/Else
- 输入一段字符串和要判断的字母,然后判定该字母是否在字符串里面,给出相应的提示
- 7-06. 奥运排行榜(25)(数学 ZJU_PAT)
- 创造 和 奉献 的辩论关系
- iOS多线程之NSThread