首页 > 其他分享 >Solution of 洛谷-P1896

Solution of 洛谷-P1896

时间:2023-09-28 12:44:07浏览次数:38  
标签:洛谷 int text 复杂度 P1896 Solution 一行 long

并不会有更好的阅读体验

\(\text{Sol}\)

我们先看一眼数据范围:

\(1 \le N \le 9\)

没关系,DFS 会出手

好吧,正经的说,如果暴搜的话复杂度会涨到 \(\text O(2^{n^2})\),\(\text T\) 到飞起。

此时我们发现有个东西叫状压 \(\text{DP}\) ,也是解决小范围数据的问题。

老套路,枚举每一行,对每一行的每一格是否放置国王进行状态压缩。

然后我们直接枚举每一行的状态与上一行的满足条件的状态进行转移就行了。

此时,其时间复杂度为 \(O(n\cdot (2^{2n}))\),足以通过此题。

\(\text{Code}\)

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

int n, k;
long long f[15][1005][100];
int c[1005];

int calc(int i) {
    int res = 0;
    for (int j = 0; j < n; j++)
        res += !!(i & (1 << j));
    return res;
}

bool check2(int i) {
    for (int j = 0; j < n - 1; j++) {
        int a = !!(i & (1 << j));
        int b = !!(i & (1 << (j + 1)));
        if (a and b) return false;
    }
    return true;
}

bool check(int i, int j) {
    int x[15], y[15];
    for (int k = 0; k < n; k++) {
        x[k] = !!(i & (1 << k));
        y[k] = !!(j & (1 << k));
    }
    if (x[0] and (y[0] or y[1])) return false;
    if (x[n - 1] and (y[n - 1] or y[n - 2])) return false;
    for (int k = 1; k < n - 1; k++) {
        if (x[k] and (y[k - 1] or y[k] or y[k + 1]))
            return false;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> k;

    for (int i = 0; i < (1 << n); i++)
        f[1][i][calc(i)] = 1;
    for (int i = 0; i < (1 << n); i++)
        c[i] = calc(i);

    for (int i = 2; i <= n; i++) {
        for (int j = 0; j < (1 << n); j++) {
            if (!check2(j)) continue;
            for (int x = c[j]; x <= k; x++) {
                for (int y = 0; y < (1 << n); y++) {
                    if (!check2(y)) continue;
                    if (!check(j, y), !check(y, j)) continue;
                    f[i][j][x] += f[i - 1][y][x - c[j]];
                }
            }
        }
    }

    // for (int i = 1; i <= n; i++) {
    //     for (int j = 0; j < (1 << n); j++) {
    //         for (int x = 0; x <= k; x++) {
    //             cerr << f[i][j][x] << " ";
    //         }
    //         cerr << endl;
    //     }
    //     cerr << endl;
    // }

    long long res = 0;

    for (int i = 0; i < (1 << n); i++)
        res += f[n][i][k];
    cout << res << endl;

    return 0;
}

标签:洛谷,int,text,复杂度,P1896,Solution,一行,long
From: https://www.cnblogs.com/LightningCreeper/p/17735494.html

相关文章

  • Solution -「模拟赛」草莓蛋糕
      \(\max(a_x+a_y,b_y+b_x)\)的贡献形式不是独立的,并不好进行分析。考虑通过分类讨论将\(\max\)拆开。若令\(h_i=a_i-b_i\),\(h'_i=b_i-a_i\),可以发现若\(h_x\geqslanth'_y\)取值则为\(b_x+b_y\),反之亦然。  注意到\(h\)本身自带一个一维偏序关系,于......
  • [洛谷]-5825排列计数-欧拉数、NTT
    目录边界对称性递推形式容斥https://www.luogu.com.cn/problem/P5825题意:我们记一个排列P的升高为\(k\)当且仅当存在\(k\)个位置\(i\)使得\(P_i<P_{i+1}\)。给定排列长度\(n\),对于所有整数\(k\in[0,n]\),求有多少个排列的升高为\(k\),\(1\leqn\leq2\times10^5\)......
  • M-SOLUTIONS Programming Contest
    A-SumofInteriorAngles答案为\(180(n-2)\)。#include<iostream>#include<cstdio>usingnamespacestd;intn;intmain(){ scanf("%d",&n); printf("%d",180*(n-2)); return0;}B-Sumo判断一下x的个数是否小于等于\(7\)。#......
  • Solution Set - 图上问题
    CF360ELink&Submission.首先显然可以选择的边的权值一定会取端点值。事实上,第一个人经过的边选最小,第一个人不经过的边选最大,这样一定不劣。进一步,如果\(s_1\)到点\(u\)的距离小于等于\(s_2\),则\((u,v)\)这条边应该取最小值。所以可以初始全部当作最大值,不断选择一条边修......
  • 对期望线性性的理解以及例题:洛谷P3239
    \(E(X+Y)\)中\(X+Y\)到底什么意思?我们不妨设\(X\)对应事件1,他有一个样本空间\(\Omega_{1}\),这个样本空间中的每一个事件对应一个取值同理我们对\(Y\)也搞一个\(\Omega_{2}\)。那么\(X+Y\)指的就是\(X\)和\(Y\)的笛卡尔积两个集合的笛卡尔积指的是从这两个集合分别各取一个元素......
  • 洛谷P6583 回首过去
    涉及知识点:容斥原理、数论分块前言本题对于数论分块类型题目推式子和处理方法有很大的启发题面Link给定正整数\(n\),求有序实数对\((x,y)\)满足\(1\leqx,y\leqn\)并且使得\(\frac{x}{y}\)为有限小数(本题题意下整数可视作小数点后有\(0\)位的有限小数)。分析首先......
  • 洛谷P3612 [USACO17JAN] Secret Cow Code S
    [USACO17JAN]SecretCowCodeS题面翻译奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当......
  • IPQ9554|Why Is the Wi-Fi 7 Solution So Irresistible?
    Intoday'sfast-paceddigitalworld,wirelessconnectivityplaysapivotalroleinourlives.Thedemandforfasterspeeds,enhancedcapacity,andlowerlatencyhasdrivencontinuousinnovationinthefieldofwirelesstechnology.EnterWi-Fi7,also......
  • the solution of Mining Your Own Business
    thedescriptionofproblem(我看的是PDF里面的原题所以这里描述会和题目不一样,但是大意一致)给定一个未必连通的无向图,问最少在几个点设置出口,可以保证任意一个点坍塌后,工人们仍然可以从出口逃生,同时问设置最少出口的方案数量。thoughts&solution我们可以知道每个连通块之......
  • 洛谷P2341 [USACO03FALL] 受欢迎的牛 G
    P2341受欢迎的牛G题解这题我们需要了解强连通分量一、定义在有向图\(G\)中,如果两个顶点\(u\),\(v\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的有向路径,则称两个顶点强连通。如果有向图\(G\)的每两个顶点都强连通,称\(G\)是一个强连通......