1044 状态压缩·一

m很小,可以用状态压缩做法,最多1<<m个状态,i每右移一位,状态随着要左移一位,判断q的限制,只需判断当前状态二进制中1的个数即可

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int d[1010][2048];
//求整数二进制中1的个数
bool is_state_ok(int s,int q)
{
    int c = 0;
    for(; s; c++)
    {
        s &= (s-1);
    }
    return c <= q;
}

int w[2048];

int main(){

    //freopen("1.txt","r",stdin);

    int n,m,q;
    scanf("%d %d %d",&n,&m,&q);
    for(int i = 0; i < n; i++)
        scanf("%d",&w[i]);

    int MASK = (1<<m)-1;

    int maxn = 0;
    memset(d,0,sizeof(d));

    d[0][0] = 0; d[0][1] = w[0];
    for(int i = 1; i < n; i++)
        for(int j = 0; j <= MASK; j++)
            if(is_state_ok(j&MASK,q))
            {
                int state = (j<<1) & MASK;
                d[i][state] = max(d[i][state],d[i-1][j]);
                int state2 = (j<<1) & MASK | 1;
                if(is_state_ok(state2,q))
                {
                    d[i][state2] = max(d[i][state2],d[i-1][j]+w[i]);
                }
            }
    for(int j = 0; j <= MASK; j++)
        maxn = max(maxn,d[n-1][j]);
    printf("%d\n",maxn);
    return 0;
}
时间: 2024-11-06 10:00:19

1044 状态压缩·一的相关文章

hiho #1044 : 状态压缩&#183;一

描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市——那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票——他们只能够乘坐最为破旧的火车进行他们的旅程. 不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况——这导致这辆车上的人非常非常的多,以至于都没有足够的位置能让每一个人都有地方坐下来. 小Hi和小Ho本着礼让他们的心情——当然还因为本

[hihoCoder] 1044 : 状态压缩&#183;一

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票--他们只能够乘坐最为破旧的火车进行他们的旅程. 不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况--这导致这辆车上的人非常非常的多,以至于都没有足够的位置能让每

hihoCoder #1044 : 状态压缩&#183;一 (清垃圾)

题意: 某车厢有一列座位,共有n个位置,清洁工要在这n个位置上清垃圾,但是不能全部位置都清理,只能选择部分.选择的规则是,连续的m个位置内,不能够清理超过q个,也就是说从第1~m个位置最多可以清q个,清q+1个就不行了.当然,q一般是小于m的,不然岂不是可以m个位置全清了?那就没限制了. 思路:看小hi小ho讲的完全是一知半解,看了大神的代码一整天才看懂意思.下面做分析(以我能理解的角度,以及通俗的角度,方便回忆.): 三个变量的定义: n: 一共有n个座位. m: 在m个连续的座位. q:最多

状态压缩简单题

状态压缩·一 题目传送:#1044 : 状态压缩·一 AC代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdi

HihoCoder 1044 垃圾清理 状态压缩&#183;一

状态压缩·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在兑换到了喜欢的奖品之后,便继续起了他们的美国之行,思来想去,他们决定乘坐火车前往下一座城市--那座城市即将举行美食节! 但是不幸的是,小Hi和小Ho并没有能够买到很好的火车票--他们只能够乘坐最为破旧的火车进行他们的旅程. 不仅如此,因为美食节的吸引,许多人纷纷踏上了和小Hi小Ho一样的旅程,于是有相当多的人遭遇到了和小Hi小Ho一样的情况--这导致这辆车上的人非常非常的多,以至于都没有足

算法练习系列—hiho1044 状态压缩二(捡垃圾)

题目地址:http://hihocoder.com/problemset/problem/1044 算法思路:此题可以看做是铺地砖的变形,没有明显的行数和状态,但是我们可以自己将其中的行和状态给扣出来.其中第一行就是N个数的中前(0,1,2-M-1), 第二行就是(2,3..M)-一直到最后一行为(N-M-N).每一行的状态个数即为2^M-1(即这M个位置要么填写1,要么填写0).此时可用F[i][j]表示第i行状态为j时的垃圾最大值.最终的结果就是第N-M行所对应的状态中的最大值. 上一遍bl

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

uva 818(dfs+图+状态压缩)

题意:有n个环,编号从1到n,给出了一些环环相扣的情况,比如给a和b表示a和b两个环的扣在一起的,每个环都是可以打开的,问最少打开多少个环,然后再扣好,可以让所有的环成为一条链. 题解:状态压缩把所有的打开环的情况枚举出来,然后拿去判断是否成立,更新打开环后的图g[i][j],和每个点的度数,不成立有三种情况,1.计算没有打开的环的度数,如果大于2说明不会有链,2.把没有打开环拿去dfs,访问过就vis[i]++,如果vis[i]>=2说明存在环,3.如果打开的环数num + 1小于链的数量,说

POJ 3254 Corn Fields 状态压缩DP (C++/Java)

http://poj.org/problem?id=3254 题目大意: 一个农民有n行m列的地方,每个格子用1代表可以种草地,而0不可以.放牛只能在有草地的,但是相邻的草地不能同时放牛, 问总共有多少种方法. 思路: 状态压缩的DP. 可以用二进制数字来表示放牧情况并判断该状态是否满足条件. 这题的限制条件有两个: 1.草地限制. 2.相邻限制. 对于草地限制,因为输入的时候1是可以种草地的. 以"11110"草地分析,就只有最后一个是不可以种草的.取反后得00001  .(为啥取反