2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

链接:https://www.nowcoder.com/acm/contest/74/F
来源:牛客网

题目描述

德玛西亚是一个实力雄厚、奉公守法的国家,有着功勋卓著的光荣军史。
这里非常重视正义、荣耀、职责的意识形态,这里的人民为此感到强烈自豪。
有一天他们想去制裁邪恶的比尔吉沃特,于是派遣了自己最优秀的战士。
结果比尔吉沃特领土太小,只有长为n宽为m共计n*m块土地,其中有些土
地标记为0表示为高山峻岭或者深海湖泊,英雄们无法在其中站立,只有标
记为1的土地才能容纳一个英雄。德玛西亚的英雄们战斗时有一个特点,他
们不希望队友站在自己旁边显得很暧昧。请问最多能有多少种安排德玛西
亚英雄的方法?

输入描述:

输入包含多组测试数据;
每组数据的第一行包含2个整数n和m (n <= 12, m <= 12 ),之间用空格隔开;
接下来的n行,每行m个数,表示n*m的比尔吉沃特领土。

输出描述:

输出一个整数n代表安排应用的方法。
(答案取膜100000000)
示例1

输入

3 3
1 1 1
0 1 1
1 0 0

输出

24

题解

状压$dp$。

$dp[i][j][k]$表示到第$i$层,放置了$j$个人,且第$i$层的放置状态为$k$的方案数。

有很多优化可以做,没做优化也可以过。

#include <bits/stdc++.h>
using namespace std;

int n, m;
int a[20][20];
int h[20];

long long dp[15][80][4100];
long long mod = 100000000LL;
int cnt[4100], error[4100];

int limit = 75;

int lowbit(int x) {
  return x & (-x);
}

void init() {
  for(int i = 1; i < (1 << 12); i ++) {
    cnt[i] = cnt[i - lowbit(i)] + 1;
  }
  for(int i = 0; i < (1 << 12); i ++) {
    for(int j = 0; j < 12; j ++) {
      int A = i & (1 << j);
      int B = i & (1 << (j + 1));
      if(A && B) error[i] = 1;
    }
  }
}

int main() {
  init();
  while(~scanf("%d%d", &n, &m)) {
    for(int i = 1; i <= n; i ++) {
      h[i] = 0;
      for(int j = 0; j < m; j ++) {
        scanf("%d", &a[i][j]);
        h[i] = h[i] * 2 + a[i][j];
      }
    }
    
    dp[0][0][0] = 1;
    for(int i = 1; i <= n; i ++) {
      for(int num = 0; num <= limit; num ++) {
        for(int now = 0; now < (1 << m); now ++) {
          dp[i][num][now] = 0;
          if(error[now]) continue;
          if((now | h[i]) != h[i]) continue;
          if(num - cnt[now] < 0) continue;
          
          for(int pre = 0; pre < (1 << m); pre ++) {
            if(pre & now) continue;
            dp[i][num][now] = (dp[i][num][now]
                               + dp[i - 1][num - cnt[now]][pre]) % mod;
          }
        }
      }
    }
    long long ans = 0;
    for(int num = 0; num <= limit; num ++) {
      for(int now = 0; now < (1 << m); now ++) {
        ans = (ans + dp[n][num][now]) % mod;
      }
    }
    printf("%lld\n", ans);
    
  }
  return 0;
}

 

转载于:https://www.cnblogs.com/zufezzt/p/8371719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
德玛杰是一个网站前端特效源码,于20213月6日发布。这个特效源码是使用HTML5、CSS3和JavaScript制作的一个响应式设计。响应式设计是指根据不同设备(如电脑、平板电脑和手机)的屏幕大小和分辨率,自动调整网站的布局和样式,以提供更好的用户体验。 德玛杰的特效源码包含了许多令人惊艳的特效效果,例如页面滚动时的平滑过渡效果、鼠标悬停时的动画效果和图片加载时的渐入效果等。这些特效效果可以通过HTML5和CSS3的新特性以及JavaScript的动画库来实现。 为了使用德玛杰的特效源码,你需要将HTML和CSS代码嵌入到你的网站中,并在JavaScript中调用相应的函数。然后,根据你的具体需求和喜好,你可以自定义特效的样式和配置参数。 德玛杰的特效源码充分展示了前端开发的创造力和技术实力。通过使用这些源码,你可以为你的网站增添独特而且吸引人的特效效果,提升用户对网站的体验和赏析。无论你是一名专业的前端开发人员还是一个对网页设计感兴趣的爱好者,德玛杰的特效源码都会给你带来新的灵感和学习的机会。 总之,德玛杰是一个使用HTML5、CSS3和JavaScript制作的响应式网站前端特效源码,它通过各种特效效果增添了网站的视觉吸引力和用户体验。无论你是想给自己的网站增添一些特效效果,还是想学习前端开发的技术,德玛杰都是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值