Chemical Reaction - UVa 10604 dp
2014-08-04 13:27
405 查看
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 isa 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 |
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 ‘.’ Foreach 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 |
思路:看了下其他人的代码,基本上都是六维的dp……还好我有独立思考的习惯……于是乎……这道题被我做成了11进制的状压dp %>_<%,dp[S]表示在S状态下最少放出的药水,vector <int> vc[i]表示在剩i瓶药水时有哪些情况。注意题目有坑,就是a类型和b类型混合,与b类型和a类型混合可能不一样(真坑,后来队友就给我讲浓硫酸和水的故事……然后就感觉自己二了)。时间挺快,0.029秒,好不容易又有排名靠前的题了。
AC代码如下:
#include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> using namespace std; int trans[15][15][2],dp[20000100],vis[20000100],pow11[15],T,t; vector <int> vc[15]; char s[110]; void solve(int S,int m1,int m2,int num) { int type,eng,S2; type=trans[m1][m2][0]; eng=trans[m1][m2][1]; S2=S-pow11[m1]-pow11[m2]+pow11[type]; if(vis[S2]==t) dp[S2]=min(dp[S2],dp[S]+eng); else { dp[S2]=dp[S]+eng; vis[S2]=t; vc[num-1].push_back(S2); } } int main() { int n,m,i,j,k,m1,m2,ans,S,len; pow11[1]=1; for(i=2;i<=7;i++) pow11[i]=pow11[i-1]*11; scanf("%d",&T); for(t=1;t<=T;t++) { scanf("%d",&m); for(i=1;i<=m;i++) for(j=1;j<=m;j++) scanf("%d%d",&trans[i][j][0],&trans[i][j][1]); scanf("%d",&n); for(i=0;i<=n;i++) vc[i].clear(); S=0; for(i=1;i<=n;i++) { scanf("%d",&k); S+=pow11[k]; } scanf("%s",s); dp[S]=0; vc .push_back(S); for(i=n;i>=2;i--) { len=vc[i].size(); for(j=0;j<len;j++) { S=vc[i][j]; for(m1=1;m1<=m;m1++) { if((S%pow11[m1+1])/pow11[m1]>=2) solve(S,m1,m1,i); for(m2=m1+1;m2<=m;m2++) if((S%pow11[m1+1])/pow11[m1]>0 && (S%pow11[m2+1])/pow11[m2]>0) { solve(S,m1,m2,i); solve(S,m2,m1,i); } } } } ans=1000000000; len=vc[1].size(); for(i=0;i<vc[1].size();i++) ans=min(ans,dp[vc[1][i]]); printf("%d\n",ans); } }
相关文章推荐
- uva 10604 化学药品链式dp
- uva 10604 - Chemical Reaction(状态压缩dp)
- dp(UVa 10604 - Chemical Reaction)
- uva 10604 Chemical Reaction (DP)
- UVA 10604(进制式dp)
- UVaLive 6680 Join the Conversation (DP)
- 【解题报告】uva10131_Is Bigger Smarter?(越大越聪明, dp, LIS)
- UVa 674 - Coin Change 背包dp
- A Spy in the Metro UVA 1025 DP
- UVa 12563 - Jin Ge Jin Qu hao [DP]
- uva 1292 - Strategic game(树形dp)
- UVA 1213 Sum of Different Primes(经典dp)
- uva 10163 dp
- UVA 111 简单DP 但是有坑
- uva 11584 - Partitioning by Palindromes(dp)
- UVA 1358 - Generator(dp+高斯消元+KMP)
- UVA1099----Sharing Chocolate----在集合上的DP
- UVa 11825 (状压DP) Hackers' Crackdown
- UVA 10534-Wavio Sequence(dp_正序逆序最长上升子序列)
- UVA 10163 Storage Keepers(两次DP)