zoukankan      html  css  js  c++  java
  • hdu

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩。它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000)。

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5045

    ——>>设dp[i][j]表示已出战了前i - 1道题目,已出战的人的状态序列为j,如今要做第i道题目的最大期望。则最后要求的结果为max{dp[M][k]}。。

    状态转移方程:dp[i][nState] = max(dp[i][nState], dp[i - 1][j] + fSolve[k][i]);

    将M进行N个N个地分块,为了让当前块加上上一个分块的结果。则要将上一个分块完毕时的结果存入当前块要利用的初始状态的结果。即:

                    if (nState == (1 << N) - 1)
                    {
                        nState = 0;
                    }

    上代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using std::max;
    
    const int MAXN = 10;
    const int MAXM = 1000 + 5;
    
    int N, M;
    double fSolve[MAXN + 1][MAXM];
    double dp[MAXM][1 << MAXN];
    double fRet;
    
    void Read()
    {
        scanf("%d%d", &N, &M);
        for (int i = 1; i <= N; ++i)
        {
            for (int j = 1; j <= M; ++j)
            {
                scanf("%lf", &fSolve[i][j]);
            }
        }
    }
    
    int CalOnes(int nNum)
    {
        int nRet = 0;
    
        while (nNum)
        {
            if (nNum & 1)
            {
                nRet++;
            }
            nNum >>= 1;
        }
    
        return nRet;
    }
    
    void Dp()
    {
        fRet = 0.0;
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= M; ++i)
        {
            for (int j = 0; j < (1 << N); ++j)
            {
                for (int k = 1; k <= N; ++k)
                {
                    if (j & (1 << (k - 1))) continue;
                    if (CalOnes(j) != (i - 1) % N) continue;
                    int nState = j | (1 << (k - 1));
                    if (nState == (1 << N) - 1)
                    {
                        nState = 0;
                    }
                    dp[i][nState] = max(dp[i][nState], dp[i - 1][j] + fSolve[k][i]);
                    if (i == M)
                    {
                        fRet = max(fRet, dp[i][nState]);
                    }
                }
            }
        }
    }
    
    int main()
    {
        int T, nCase = 0;
    
        scanf("%d", &T);
        while (T--)
        {
            Read();
            Dp();
            printf("Case #%d: %.5f
    ", ++nCase, fRet);
        }
    
        return 0;
    }
    



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Windows 配置JAVA的环境变量
    不直接用NSLog
    Mongodb for Mac 安装
    Redis Mac 安装及简单命令使用
    第十五天和十六天学习笔记
    第十四天学习笔记
    第十三天学习笔记
    第十二天学习笔记
    第十一天学习笔记
    第十天学习笔记
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4855488.html
Copyright © 2011-2022 走看看