uva 10604 - Chemical Reaction (记忆化搜索)
来源:互联网 发布:软件工程云计算 编辑:程序博客网 时间:2024/05/06 21:18
Problem E
CHEMICAL REACTION
In a chemist’s lab, there are several types of chemicals in tubes. The chemist wants to mix all these chemicals together, two chemicals at a time. Whenever two chemicals are mixed, some heat is generated and released into the air and the mixed chemical is a known chemical of possibly other type than the original two. The resulting chemical type and the amount of heats emitted can looked up in the chemical mixture table.
Chemicals
1
2
3
Resulting chemical type
Heats emmited
Resulting chemical type
Heats emmited
Resulting chemical type
Heats emmited
1
1
0
3
-10
3
3000
2
3
-10
2
0
1
-500
3
3
3000
1
-500
3
0
For example, in the above chemical mixture table, there are three types of chemicals: 1, 2, and 3. If you mix chemicals 1 and 3, they produce +3000 units of heat and turn into chemical 3. Sometimes, the heat generated can be negative. For instance, you can mix 2 and 3 and they turn into chemical 1 and in the meantime, cool down the lab by 500 units of heat. Since the chemist lacks funding to buy necessary equipments to protect himself from the heat generated, it is utmost important to find a way to mix all the chemicals together that produces the least total heat, regardless of the final chemical type. For example, suppose the lab has four tubes containing chemicals of types 1, 2, 2, and 3. If the chemicals are mixed in the parenthesize order of ((1 2) (2 3)), it will produce (–10)+ (-500)+(3000) = 2490 units of heat. However, if the chemicals are mixed in the (2 (1 (2 3))) order, it will produce (-500)+0+(-10)= -510 units of heat, which is also the least total heat possible.
Input
The first line of input file consists of a single number denoting the number of test cases in the file. There is a single line containing a ‘/’ character separating two consecutive test cases. The end of the file is marked with a line containing a ‘.’ For each test case, the first line contains an integer number m (1≤m≤6) denoting the number chemical types. Therefore, the chemicals are indexed from 1 up to at most 6. The next mxm lines give the chemical mixture table entries in the row-major order. Each line contains the new resulting chemical type and the amount of energy emitted. After the table entries is a line with a single number k (2≤k≤10) denoting number of tubes in the lab. The next line then contains k integers in the range of 1 and m, separated by blank spaces, denoting the types of chemicals in those k tubes.
Output
For each test case, output the least total heat possible on a single line.
Sample Input
Sample Output
2
3
1 0
3 -10
3 3000
3 -10
2 0
1 -500
3 3000
1 -500
3 0
4
1 2 2 3
/
3
1 0
3 500
3 -250
3 500
2 0
1 100
3 -250
1 100
3 0
6
1 1 1 2 2 3
.
-510
-650
Problem translation: LitteJohn
Problem solution: LitteJohn
这题加深了对什么时候用记忆化搜索的理解。只要状态数少到可以存的下,就加记忆化,省时间。
#include<cstdio>#include<algorithm>#include<vector>#include<cstring>#include<stack>#include<iostream>#include<queue>using namespace std;const int maxn = 10 + 5;const int INF = 1000000000;typedef pair<int, string> P;int res_heat[maxn][maxn];int res_to[maxn][maxn];int num[maxn];int dp[1000000];int Hash(){ int ret = 0; int dig = 1; for(int i = 1;i <= 6;i++){ ret += num[i]*dig; dig *= 10; } return ret;}int dfs(int seq){ if(dp[seq] != -1) return dp[seq]; int Min = INF; for(int i = 1;i <= 6;i++){ for(int j = 1;j <= 6;j++){ if((i == j && num[i]>=2) || (i != j && num[i]>=1 && num[j]>=1)){ num[i]--; num[j]--; int heat = res_heat[i][j]; int to = res_to[i][j]; num[to]++; Min = min(Min, heat+dfs(Hash())); num[i]++; num[j]++; num[to]--; } } } if(Min == INF) return dp[seq]=0; return dp[seq]=Min;}int main(){ int t; scanf("%d", &t); while(t--){ int n; scanf("%d", &n); for(int i = 1;i <= n;i++){ for(int j = 1;j <= n;j++){ scanf("%d%d", &res_to[i][j], &res_heat[i][j]); } } int k; scanf("%d", &k); memset(num, 0, sizeof num); while(k--){ int x; scanf("%d", &x); num[x]++; } memset(dp, -1, sizeof dp); printf("%d\n", dfs(Hash())); char tem[5]; scanf("%s", tem); if(tem[0] == '.') break; } return 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
- dp(UVa 10604 - Chemical Reaction)
- uva 10604 Chemical Reaction (DP)
- Chemical Reaction - UVa 10604 dp
- uva 10604 - Chemical Reaction(状态压缩dp)
- linux系统下修改SSH端口及iptables设置方法
- Ansible 源码安装与基本使用
- hduoj2003(求绝对值)
- Zebra-striping nested lists with CSS
- 如何从ios酷我音乐盒中导出已下载的音乐文件(使用Java编程实现)
- uva 10604 - Chemical Reaction (记忆化搜索)
- windwos 下不错的工具
- Linq系列:基础与本质(Part III)
- summer vacation项目1 - 用枚举表示对称方式
- ORA-00922:选项缺失或无效
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 在项目现场要做到-不卑不亢
- linux下配置集群
- Threejs 的场景查看 - 几个交互事件库助你方便查看场景