您的位置:首页 > Web前端 > React

uva 10604 Chemical Reaction 记忆化搜索

2015-03-03 10:12 225 查看
uva 10604 Chemical Reaction

解决方案:dp思路:记忆化搜索,这题只有六种化学药品,可以开一个六维的数组进行dp,dp[a1][a2][a3][a4][a5][a6],a1...a6分别表示这六种药品剩余多少,然后选两种药品进化学反应(可以使同样类型的药品),进入下一状态进行搜索,每个状态由下一状态决定其最优值。

code:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int dp[12][12][12][12][12][12];
int flag[12][12][12][12][12][12];
int cnt[7];
int trans[7][7][2];
int dfs(int a1,int a2,int a3,int a4,int a5,int a6)
{
int &f=flag[a1][a2][a3][a4][a5][a6];
int &result=dp[a1][a2][a3][a4][a5][a6];
if(f)
{
return result;
}
f=true;
result=inf;
for(int i=1; i<=6; i++)
{
for(int j=1; j<=6; j++)
{
if(i==j&&cnt[i]<2) continue;
if(cnt[i]>=1&&cnt[j]>=1)
{
cnt[i]--,cnt[j]--;
cnt[trans[i][j][0]]++;
result=min(result,dfs(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],cnt[6])+trans[i][j][1]);
cnt[trans[i][j][0]]--;
cnt[i]++,cnt[j]++;
}
}
}
if(result==inf) return result=0;
return result;
}
int main()
{
int t,n,k;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
int res,heat;
scanf("%d%d",&res,&heat);
trans[i][j][0]=res;
trans[i][j][1]=heat;
}
}
memset(cnt,0,sizeof(cnt));
memset(flag,false,sizeof(flag));
scanf("%d",&k);
for(int i=1; i<=k; i++)
{
int cubes;
scanf("%d",&cubes);
cnt[cubes]++;
}
printf("%d\n",dfs(cnt[1],cnt[2],cnt[3],cnt[4],cnt[5],cnt[6]));
char skip[3];
scanf("%s",skip);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: