Праздничные команды скот с 3 сезона - нивы (например, давления DP)

Creative Commons License Copyright атрибуции, позволяет другим создавать на бумажной основе, и должны распространять документ (на основе оригинального лицензионного соглашения с той же лицензией Творческое Commons )

Ссылки: https://ac.nowcoder.com/acm/contest/945/E
Источник: Крупный рогатый скот-офф сети

Название Описание

Фермер Джон купил пышное новое прямоугольное пастбище , состоящее из М с помощью N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) квадратных участков. Он хочет , чтобы вырастить некоторые вкусную кукурузу для коров по ряду квадратов. К сожалению, некоторые из квадратов бесплодны и не могут быть установлены. Канни FJ знает , что коровы не любят еду близко друг к другу, поэтому при выборе которых квадраты посадить, он избегает выбора квадратов , которые являются смежными; нет двух выбранных квадратов не разделяют ребро. Он еще не сделал окончательный выбор, которые квадраты на завод.
Будучи очень непредвзятым человеком, фермер Джон хочет , чтобы рассмотреть все возможные варианты , как выбрать квадраты для посадки. Он настолько открытый , что он считает , не выбирая ни одного квадрата в качестве допустимого варианта! Пожалуйста , помогите Farmer John определить количество способов , он может выбрать квадраты на завод.

Введите описание:

Строка 1: два целых числа M и N
Линии 2 ... М + 1: строка I + 1 описывает каждую ячейку в строке я ранчо, N пробел целые числа , указывающие , могут ли быть установлены ячейка (1 означает плодородной и пригодной для посадки, 0 означает бесплодной и не подходит для посадки).

Выход Описание:

Строка 1: целое число: FJ общее число альтернатив, разделенных оставшейся 100000000.

Пример 1

2 3
1 1 1
0 1 0

экспорт

9

Проблема решения идеи:

Количество каждой строки сжато в десятичное состояние, например, десятичный 111 является 7, обозначается через 7 в этом состоянии.
Точка записи каждой строки подходит для посадки 0 (более удобный , чем 1 определяет , является ли конфигурация может быть основано на качестве возможного решения, упоминается как начало 1, WA несколько раундов, как 0 или позже нашли удобным)
две верхние и нижние строки конфликт с & Ь! = 0 указывает , является
ли или нет сформулировано в некоторых случаях это возможно, так как во втором ряду 010, то невозможно дублирован 110 (не первый), или 011 (не третий) или же (основание и в) == 0 представляет собой возможно.

; Переходного состояния уравнение
представляется возможным число решений дп [I] [J] обозначает I-й строки, J состояние
d п [ я ] [ J ] знак равно Σ е р & ThinSpace; L L & ThinSpace; К & ThinSpace; вес час я с час & ThinSpace; & ThinSpace; р е & ThinSpace; v L я d & ThinSpace; & ThinSpace; е р & ThinSpace; & ThinSpace; р вес & ThinSpace; & ThinSpace; я - 1 & ThinSpace; N d & ThinSpace; & ThinSpace; с м p a t i b l e   f o r   c o n d i t i o n   j d p [ i 1 ] [ k ] дп [I] [J] = \ сумма \ limits_ {для \, все \, к \, что \, \, являются \, справедливы \, \, для \, \, строка \, \, я - 1 \, и \, \, совместимый \ для \, условие \ J} {дп [я - 1] [к]}

AC код:

/*
 * Copyright (c) 2019 Ng Kimbing, HNU, All rights reserved. May not be used, modified, or copied without permission.
 * @Author: Ng Kimbing, HNU.
 * @LastModified:2019-06-25 T 11:09:41.155 +08:00
 */
package ACMProblems.QianDaoTi;

import static ACMProblems.ACMIO.*;

/*
 * 链接:https://ac.nowcoder.com/acm/contest/945/E
 * 来源:牛客网
 *
 * ## 题目描述 
 * Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and can't be planted. Canny FJ knows that the cows dislike eating close to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.
 * Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways he can choose the squares to plant.
 * ## 输入描述:
 * Line 1: two space-separated integers M and N
 * Lines 2.. M+1: row I +1 describes each cell in row I of the ranch, N space-separated integers indicating whether the cell can be planted (1 means fertile and suitable for planting, 0 means barren and not suitable for planting).
 * ## 输出描述:
 * Line 1: an integer: FJ total number of alternatives divided by a remainder of 100,000,000.
 * ## 示例1
 * >2 3
 * 1 1 1
 * 0 1 0
 *
 * ## 输出
 * >9
 *
 * ## 解题思路:
 * 将每一行的数都压缩成一个十进制的状态,如 1 1 1的十进制是7,则用7来表示这个状态。
 * 将每行suitable for planting的点记录为0(比1更方便判断是否可以基于这个构造一种可能的solution,一开始记为1, WA了几发,后来发现还是记为0方便)
 * 上下两行会冲突,用 a&b != 0 表示
 * 是否有可能配制成目标情况, 如第二行 0 1 0, 则不可能配成1 1 0 (第一个不行)或是 0 1 1 (第三个不行)或是别的 (base & to) == 0 表示可行。
 */
public class BitDp {
    private static final int MOD = 100000000;
    private static int[] row = new int[13];
    private static int[] validList = new int[400];
    private static int[][] dp = new int[13][400];

    private static int not(int foo) {
        return foo == 0 ? 1 : 0;
    }

    public static void main(String[] args) throws Exception {
        setStream(System.in);
        int rowNum = nextInt();
        int colNum = nextInt();// col Num
        for (int i = 0; i < rowNum; i++)
            for (int j = 0; j < colNum; j++)
                row[i] = (row[i] << 1) | not(nextInt());
        int maxCondition = 1 << 12, k = 0;
        for (int i = 0; i < maxCondition; i++)
            if ((i & (i << 1)) == 0)
                validList[k++] = i;
//        System.out.println(Arrays.toString(validList));
        validList[k] = maxCondition;
        maxCondition = 1 << colNum;
        for (int i = 0; validList[i] < maxCondition; i++)
            if (settable(row[0], validList[i]))
                dp[0][i] = 1;
        for (int r = 1; r < rowNum; r++)
            processRow(r, maxCondition);
        int theLastRow = rowNum - 1;
        int ans = 0;
        for (int i = 0; validList[i] < maxCondition; ++i)
            ans = (ans + dp[theLastRow][i]) % MOD;
        System.out.println(ans);
    }

    private static boolean settable(int base, int to) {
        return (base & to) == 0;
    }

    private static boolean willConflict(int a, int b) {
        return (a & b) != 0;
    }

    private static void processRow(int r, int maxCondition) {
        // for each valid case
        for (int i = 0; validList[i] < maxCondition; i++) {
            if (dp[r - 1][i] == 0)
                continue;
            int tryLastRow = validList[i];
            // is settable
            if (!settable(row[r - 1], tryLastRow))
                continue;
            // list[i] is valid.
            for (int j = 0; validList[j] < maxCondition; j++) {
                int tryThisRow = validList[j];
                if (settable(row[r], tryThisRow) && !willConflict(tryLastRow, tryThisRow))
                    dp[r][j] = (dp[r][j] + dp[r - 1][i]) % MOD;  // += last row valid num
            }
        }
    }
}


рекомендация

отblog.csdn.net/weixin_44090305/article/details/93600258