设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3190|回复: 12
打印 上一主题 下一主题

[讨论] 论MC中的数学

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
369
在线时间
1605 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

1
发表于 2017-10-13 21:10:09 | 显示全部楼层
随便写写懒的优化了
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <queue>
  4. using namespace std;
  5. // 0 water 1 veg
  6. int dp[9][(1<<9)][1<<9];

  7. bool checkok(int now, int upper, int upper1) {
  8.         if (upper & 1){
  9.                 if ((now & 1) && (upper1 & 1) && ((upper >> 1) & 1))
  10.                         return false;
  11.         }
  12.         if ((upper >> 8) & 1){
  13.                 if (((now>>8) & 1) && ((upper1>>8) & 1) && ((upper >> 7) & 1))
  14.                         return false;
  15.         }
  16.         for (int i = 1; i < 8; i++) {
  17.                 if ((upper >> i) & 1) {
  18.                         if ( ((upper >> (i - 1))&1) && ((upper >> (i + 1))&1) && ((now >> (i))&1) && ((upper1 >> (i))&1)) {
  19.                                 return false;
  20.                         }
  21.                 }
  22.         }
  23.         return true;
  24. }


  25. int count1(int x){
  26.         int cnt = 0;
  27.         while (x){
  28.                 cnt+=x&1;
  29.                 x >>= 1;
  30.         }
  31.         return cnt;
  32. }

  33. int main(){
  34.         for (int i = 0; i < (1<<9); i++){
  35.                 dp[0][i][(1 << 9) - 1] = count1(i);
  36.         }

  37.         for (int i = 1; i < 9; i++){
  38.                 for (int now = 0; now < (1<<9); now++){
  39.                         for (int upper = 0; upper < (1<<9); upper++)
  40.                                 for (int upper1 = 0; upper1 < (1<<9); upper1++){
  41.                                         if (checkok(now, upper, upper1)) {
  42.                                                 dp[i][now][upper] = max(dp[i][now][upper], dp[i - 1][upper][upper1] + count1(now));
  43.                                         }
  44.                         }
  45.                 }
  46.         }

  47.         int ans = 0;
  48.         for (int upper = 0; upper < (1<<9); upper++) {
  49.                 for (int upper1 = 0; upper1 < (1<<9); upper1 ++){
  50.                         if (checkok((1<<9) - 1, upper, upper1)) {
  51.                                 ans = max(ans, dp[8][upper][upper1]);
  52.                         }
  53.                 }
  54.         }
  55.         printf("%d\n", ans);

  56. }
复制代码

评分

参与人数 2星屑 +10 +2 收起 理由
tjjlb + 10 + 1 我很赞同
taroxd + 1 塞糖

查看全部评分

哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-4 17:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表