acwing 1064. 骑士

在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8个格子,求使它们无法互相攻击的方案总数。

输入格式

共一行,包含两个整数 n和 k。

输出格式

共一行,表示方案总数,若不能够放置则输出0。

数据范围

1≤n≤10,
0≤k≤n^2

输入样例:

3 2

输出样例:

16

解题报告:f[i][j][k]对应的就是第i行状态为j,已经选了k个国王的方案的集合,状态转移方程,如果盲算,ijk*状态j的枚举=1e9,应该会超时,但是我们可以把合法的状态已经某一个状态对应的状态存起来,这样就能优化不少了,接下来想想状态怎么转移,f[i][j][k]可以由前i-1行j`(这里指j上一行的合法状态)[k-选的国王数量]所有这样的集合转移过来,至于如何判断是否是合法状态,第一存在相邻的1(相邻的国王) 肯定不合法,第二如果两行|起来有相邻的1也不行,两行&起来不能有1。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const   int N=12,M=1<<10,K=110;
typedef long long ll;
ll f[N][M][K];
int cnt[M];
vector<int>state;
vector<int>head[M];
int n,m;
bool check (int state)
{
   
    for (int i=0;i< n;i++)
    if(((state >> i)&1) && (state >> i+1 & 1))
    return false;
    return true;
}
int count(int state)
{
   
    int cnt=0;
    for(int i = 0;i < n ;i ++)
    if( state>>i&1)
    cnt++;
    return cnt;
}
int main()
{
   
    cin >> n >> m;
    for(int i=0;i< 1<<n ;i ++)
    if(check(i))
    {
   
        state.push_back(i);
        cnt[i]=count(i);    
    }
    //for(int i=0;i<state.size();i++)
   // cout<<state[i]<<' '<<cnt[state[i]]<<endl;
    for(int i=0;i<state.size();i++)
    for(int j=0;j<state.size();j++)
    {
   
        int state1=state[i] , state2=state[j];
        if(check(state1 | state2) && (state1 & state2)==0)
        head[i].push_back(j);
    }
// exit(0);
    f[0][0][0]=1;//什么也不选也是一种方案
    for(int i=1;i<=n+1;i++)
    for(int j=0;j<state.size();j++)
    for(int k=0;k<=m;k++)
    {
      
    for(int jj=0;jj<head[j].size();jj++)
    if(k>=cnt[state[head[j][jj]]])		//当然,国王数不够用就不能转移。
    f[i][j][k]+=f[i-1][head[j][jj]][k-cnt[state[head[j][jj]]]];     
    }
    cout<<f[n+1][0][m]<<endl;//传统的方案应该把第n层数量为m的都加起来,看到大佬写的可以用第n+1啥也不选的总共国王为m方案的总数,nb。
}

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务