前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU-3237-Help Bubu

HDU-3237-Help Bubu

作者头像
f_zyj
发布2018-01-09 10:53:20
5550
发布2018-01-09 10:53:20
举报

ACM模版

描述

描述
描述

题解

image.png
image.png

代码

代码语言:javascript
复制
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int MAXB = 8;
const int MAXN = 110;
const int MAXM = 1 << MAXB;
const int LIMIT = 25;
const int INF = 0x3f3f3f3f;

int n, m, ans;
int book[MAXN];
int cnt[MAXM];
int state;
int dp[2][MAXN][MAXM][MAXB + 1];

void init()
{
    for (int i = 0; i < MAXM; i++)
    {
        for (int j = 0; j < MAXB; j++)
        {
            if (i & (1 << j))
            {
                cnt[i]++;
            }
        }
    }
}

int main()
{
    init();

    int ce = 0;

    while (~scanf("%d%d", &n, &m) && n + m)
    {
        int mx = state = 0;
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", book + i);

            book[i] -= LIMIT;
            if (book[i] > mx)
            {
                mx = book[i];
            }
            state |= (1 << book[i]);
        }

        ++mx;
        int tot = (1 << mx);
        memset(dp[1], 0x3f, sizeof(dp[1]));
        dp[1][0][1 << book[1]][book[1]] = 1;
        dp[1][1][0][mx] = 0;
        for (int i = 2; i <= n; i++)
        {
            int cur = i & 1;
            int pre = 1 - cur;
            memset(dp[cur], 0x3f, sizeof(dp[cur]));

            for (int j = 0; j <= m && j < i; j++)
            {
                for (int k = 0; k < tot; k++)
                {
                    for (int s = 0; s <= mx; s++)
                    {
                        if (dp[pre][j][k][s] == INF)
                        {
                            continue;
                        }

                        int tmp = k | (1 << book[i]);
                        if (j < m)
                        {
                            dp[cur][j + 1][k][s] = min(dp[cur][j + 1][k][s], dp[pre][j][k][s]);    //  取最后一本
                        }

                        if (s == book[i])
                        {
                            dp[cur][j][k][s] = min(dp[cur][j][k][s], dp[pre][j][k][s]);
                        }
                        else
                        {
                            dp[cur][j][tmp][book[i]] = min(dp[cur][j][tmp][book[i]],
                                                           dp[pre][j][k][s] + 1);
                        }
                    }
                }
            }
        }

        int cur = n & 1;
        int ans = n, st;
        for (int j = 0; j <= m; j++)
        {
            for (int k = 0; k < tot; k++)
            {
                for (int s = 0; s < mx; s++)
                {
                    if (dp[cur][j][k][s] != INF)
                    {
                        st = state ^ k;        //  抽走的就是额外的类
                        ans = min(ans, cnt[st] + dp[cur][j][k][s]);
                    }
                }
            }
        }

        printf("Case %d: %d\n\n", ++ce, ans);
    }

    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 题解
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档