UVA 10604 Chemical Reaction
生活随笔
收集整理的這篇文章主要介紹了
UVA 10604 Chemical Reaction
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
UVA_10604
? ? 一開始看錯題了,以為化學物質最多會有10個,所以定義不了10維的去跑,便用了類似狀態壓縮的方式,把化學物質的狀態壓縮成一個整數,然后用哈希表建立一個索引,再用記憶化搜素去處理就可以了。
? ? 之所以能這么做,關鍵在于總狀態并不是很多,我們可以粗略的估算一下,即便有10種藥品時,狀態最多有(10^10)/10!,考慮到混合之后達到的狀態,最多再乘個10而已,用計算器算一下,數值還是比較小的。
? ? 當然這個題目可以用6維的數組去跑,但如果藥品數多了之后n維的f顯然空間是開不下的,但總狀態數卻不是很多,所以哈希表雖然寫著復雜,但多少有些適用范圍的優勢。
??? 此外,要注意到這個題目A和B混合與B和A混合有可能是不一樣的,所以我們在枚舉決策的時候要注意一下。
#include<stdio.h>#include<string.h>
#define MAXN 10
#define HASH 1000003
#define MAXD 50000
#define INF 0x3f3f3f3f
int N, K, e, head[HASH], next[MAXD], st[MAXD][6], g[MAXN][MAXN], heat[MAXN][MAXN], f[MAXD];
int hash(int p[])
{
int i, v = 0;
for(i = 0; i < 6; i ++)
v = v * 10 + p[i];
return (v & 0x7fffffff) % HASH;
}
void insert(int s)
{
int h = hash(st[s]);
next[e] = head[h];
head[h] = e;
e ++;
}
int check(int s)
{
int i;
int h = hash(st[s]);
for(i = head[h]; i != -1; i = next[i])
if(memcmp(st[i], st[s], sizeof(st[i])) == 0)
break;
return i;
}
void init()
{
int i, j, k, t;
scanf("%d", &N);
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
{
scanf("%d%d", &k, &t);
k --;
g[i][j] = k;
heat[i][j] = t;
}
}
int dp(int cur)
{
int i, j, k, t, min = INF;
k = check(cur);
if(k >= 0)
return f[k];
insert(cur);
for(i = 0; i < 6; i ++)
if(st[cur][i])
for(j = 0; j < 6; j ++)
if(st[cur][j])
{
if(j == i && st[cur][j] < 2)
continue;
memcpy(st[e], st[cur], sizeof(st[e]));
st[e][i] --, st[e][j] --, st[e][g[i][j]] ++;
t = dp(e);
if(t + heat[i][j] < min)
min = t + heat[i][j];
}
if(min == INF)
min = 0;
return f[cur] = min;
}
void solve()
{
int i, j, k, res;
memset(head, -1, sizeof(head));
memset(st[0], 0, sizeof(st[0]));
scanf("%d", &K);
for(i = 0; i < K; i ++)
{
scanf("%d", &k);
k --;
st[0][k] ++;
}
e = 0;
memset(f, 0x3f, sizeof(f));
res = dp(e);
printf("%d\n", res);
}
int main()
{
int t;
char b[5];
scanf("%d", &t);
while(t --)
{
init();
solve();
scanf("%s", b);
}
return 0;
}
轉載于:https://www.cnblogs.com/staginner/archive/2011/12/06/2277838.html
總結
以上是生活随笔為你收集整理的UVA 10604 Chemical Reaction的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++静态数据成员和静态成员函数
- 下一篇: 卷积,DFT,FFT,图像FFT,FIR