备赛蓝桥——试题 算法训练 N车(dp)(python)

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  给定N×N的棋盘,问有多少种放置N个车使他们不互相攻击的方案。

输入格式

  一行一个整数,N。

输出格式

  一行一个整数,表示方案数。

样例输入

3

样例输出

6

数据规模和约定

  N<=20

一开始认为是八皇后问题的简化版,非常天真的用深搜去解决,结果被数据量给教育了。。。超时,只得了30分。

# 开发人:HGC
# 开发时间:2022-02-08 10:47

n = int(input())
tmap = [-1] * n
ans = 0

def dfs(step, row):
    global tmap, ans
    if step >= n:
        ans += 1
        return
    for i in range(n):
        if i not in tmap:
            tmap[row] = i
            dfs(step + 1, row + 1)
            tmap[row] = -1


dfs(0, 0)
print(ans)

后面改用动态规划的思想,但是这个题的规律非常简单,称不上是动态规划题目,只能算是找规律

例如,题目中给出的3*3矩阵,当我们在第一行放置了一个车,这个车所在的行列就被排除在剩下两个车能放的空间之外了,剩下的问题相当于2*2矩阵放置两个车。而第一行有放置第一个车时有三个选择(1,1)(1,2)(1,3),所以如果用dp[i]表示i*i矩阵放置车的方法数,那么dp[3]=dp[2]*3=dp[1]*2*3=6。剩下就很简单了。

# 开发人:HGC
# 开发时间:2022-02-08 11:12

n=int(input())
dp=[0]*(n+1)
dp[1]=1
for i in range(2,n+1):
    dp[i]=dp[i-1]*i
print(dp[n])

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值