zoukankan      html  css  js  c++  java
  • UVA 10604 Chemical Reaction(六维dp数组)

    题意:有六种不同的试剂,放于试管中,不同的试剂融合其产生的热量不同,且生成的新试剂也不相同,问最后最低温度是多少。

    分析:由于只有六种试剂,所以开辟一个六维dp数组,进行乱搞就可以了,这里要注意的是试管是可以任意组合,且两个试管先后
               顺序不同的话,产生的热量也不同,还有同一种试剂也能融合的

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int INF=99999999;
    int flag[10][10][10][10][10][10];
    int dp[10][10][10][10][10][10];
    int vis[20];
    int mat[10][10][3];
    
    int DFS(int a,int b,int c,int d,int e,int f)
    {
        int &judge=flag[a][b][c][d][e][f];
        int &res=dp[a][b][c][d][e][f];
        if(judge) return res;
        res=INF;
        judge=1;
        for(int i=1;i<=6;i++)
        {
            for(int j=1;j<=6;j++)
            {
                if(i==j && vis[i]<2) continue;
                if(vis[i]>=1 && vis[j]>=1)
                {
                    vis[i]--;
                    vis[j]--;
                    vis[mat[i][j][0]]++;
                    int tmp=DFS(vis[1],vis[2],vis[3],vis[4],vis[5],vis[6]);
                    if(tmp!=INF) res=min(tmp+mat[i][j][1],res);
                    vis[i]++;
                    vis[j]++;
                    vis[mat[i][j][0]]--;
                }
            }
        }
        if(res==INF) return res=0;
        return res;
    }
    
    int main()
    {
        int T,i,j,m,t1,t2;
        char op[10];
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&m);
            memset(vis,0,sizeof(vis));
            memset(flag,0,sizeof(flag));
            for(i=1;i<=m;i++)
            {
                for(j=1;j<=m;j++)
                {
                    scanf("%d%d",&t1,&t2);
                    mat[i][j][0]=t1;
                    mat[i][j][1]=t2;
                }
            }
            int k,temp;
            scanf("%d",&k);
            for(i=0;i<k;i++)
            {
                scanf("%d",&temp);
                vis[temp]++;
            }
            int ans=DFS(vis[1],vis[2],vis[3],vis[4],vis[5],vis[6]);
            printf("%d\n",ans);
            scanf("%s",op);
        }
        return 0;
    }
  • 相关阅读:
    定义字符串数组
    ifconfig 修改IP
    空指针与野指针的区别
    GDB和Core Dump使用笔记
    雅虎(ycsb)测试hbase(压测)
    decode函数的几种用法
    NVL函数:空值转换函数
    hive行转列,列转行
    case when then else end用法
    hive中一般取top n时,row_number(),rank,dense_ran()常用三个函数
  • 原文地址:https://www.cnblogs.com/zsboy/p/3104582.html
Copyright © 2011-2022 走看看