算法入门-[SCOI2005]互不侵犯KING

[SCOI2005]互不侵犯KING

https://ac.nowcoder.com/acm/problem/20240

题意

  • 有一个N*N(N<10)的棋盘,其中需要放置K个国王,国王会攻击以他为中心的九宫格范围内的棋子,要是所有国王互不攻击,总共有多少种方案

思路

  • 如果按顺序从上到下,从左到右,每次放置新的国王的时候都需要考虑它左边和上侧的国王,状态过于复杂难以描述
  • 由于N不大可以考虑一行一行放置,这样每一次只需要考虑上一行的状态即可
  • 使用01串描述每一行的状态,提前预处理出来每一行合法的情况,避免动态规划过程中反复枚举
  • 对于不打架这件事
    • 行内:左右不能相邻,如果用a来表示这一行的状态,那就要保证
    • 当前行和上一行:对于上一行的一个棋子,他的正下方,左下,右下不能有棋子,即保证
  • 对于动态规划,我们首先需要描述行,其次需要知道已经摆了多少个棋子,最后要知道状态,所以用三个维度来描述状态
    • 表示第i行,一共放置了j个棋子,放置状态为k

代码

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

int calc(int x){
    int ans=0;
    while(x){
        if(x&1)ans++;
        x>>=1;
    }
    return ans;
}
long long dp[10][120][120];
vector<int> st;
vector<int> num;
int main(){
    int n,k;
    cin >> n >> k;
    //枚举可能的状态
    for(int i=0;i<(1<<n);i++){
        if(i&(i<<1))continue;
        st.push_back(i);
        num.push_back(calc(i));
    }

    dp[0][0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=k;j++){
            for(int cur=0;cur<st.size();cur++){
                if(num[cur]>j) continue;
                for(int lst=0;lst<st.size();lst++){
                    if(num[lst]+num[cur]>j) continue;
                    if((st[cur]&st[lst])||(st[cur]&(st[lst]<<1))||(st[cur]&(st[lst]>>1))) continue;
                    dp[i][j][cur]+=dp[i-1][j-num[cur]][lst];
                }
            }
        }
    }
    long long ans=0;
    for(int i=0;i<st.size();i++){
        ans+=dp[n][k][i];
    }
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:47
机械打工仔:你自己匿名可以,这么好的公司就别给它匿名了
点赞 评论 收藏
分享
06-19 19:06
门头沟学院 Java
码农索隆:别去东软,真学不到东西,真事
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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