AtCoder Beginner Contest 159 E - Dividing Chocolate枚举

Posted 1024-xzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder Beginner Contest 159 E - Dividing Chocolate枚举相关的知识,希望对你有一定的参考价值。

题目链接
数据范围:
(1≤H≤10)
(1≤W≤1000)
(1≤K≤H×W)

分析:

先观察数据,发现行数特别小,那么我们就可以枚举行的分法,对于每一种分法,求出列的划分数,取最小。
先用二维前缀和,预处理整个图。
复杂度:(O(2^H*H*W))

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1010;
char s[15][N];
int num[15][N];
int main()
{
    int h,w,k,ans=0;
    scanf("%d%d%d",&h,&w,&k);
    for(int i=1;i<=h;i++)
        scanf("%s",s[i]+1);
    for(int i=1;i<=h;i++)
    {
        for(int j=1;j<=w;j++)
            num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1]+s[i][j]-‘0‘;
    }
    if(h==1)
    {
        int st=0;
        for(int i=1;i<=w;i++)
        {
            if(num[1][i]-num[1][st]==k&&i<w)
            {
                ans++;
                st=i;
            }
            printf("%d
",ans);
            return 0;
        }
    }
    ans=h*w;
    for(int i=0;i<(1<<(h-1));i++)//行的划分种类数
    {
        int c=0,r;
        int res=__builtin_popcount(i);
        bool g=0;
        for(int j=1;j<=w;j++)//枚举列
        {
            bool f=0;
            r=0;
            for(int u=1;u<=h;u++)
            {
                if((1&(i>>(u-1)))||u==h)
                {
                    int t=num[u][j]+num[r][c]-num[r][j]-num[u][c];
                    r=u;
                    if(t>k)
                        f=1;
                }
            }
            if(f&&j==c+1)
            {
                g=1;
                break;
            }
            if(f)
            {
                res++;
                c=j-1;
            }
        }
        if(!g)
            ans=min(res,ans);
    }
    printf("%d
",ans);
    return 0;
}

以上是关于AtCoder Beginner Contest 159 E - Dividing Chocolate枚举的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Beginner Contest 234

AtCoder Beginner Contest 115 题解

AtCoder Beginner Contest 154 题解

AtCoder Beginner Contest 103

AtCoder Beginner Contest 228

AtCoder Beginner Contest 242