UVA 10237 - Bishops(递推)

UVA 10237 - Bishops

题目链接
题意:问一个n * n棋盘能放k个主教(攻击斜线)的方案数。

思路:递推,首先考虑一个问题,在一个nn棋盘上,放k个车的方案数。
那么设dp[i][j]为i行用了j个车的方案数,由于每行只能放一个车,那么考虑i行放不放车,如果放车,那么能放的位置有n(j1)个位置,为dp[i1][j1](n(j1))
如果不放那么情况为dp[i1][j]
所以递推式为dp[i][j]=dp[i][j1]+dp[i1][j1](n(j1))

然后回到这个问题,主教攻击斜线,那么只要把棋盘旋转45度就和车的方法相同了。
然后黑格和白格的方案数相乘累加起来就是总方案数
代码:

#include <stdio.h>
#include <string.h>

const int N = 35;
int n, k;
long long f1[N][N * N], f2[N][N * N];

int main() {
    while (~scanf("%d%d", &n, &k) && n || k) {
        f1[0][0] = f2[1][0] = 1;
        for (int i = 1; i <= n; i++) {
            int len = (i + 1) / 2 * 2 - 1;
            f1[i][0] = f1[i - 1][0];
            for (int j = 1; j <= len; j++) {
                f1[i][j] = f1[i - 1][j] + (len - j + 1) * f1[i - 1][j - 1];
               }
          }
          for (int i = 2; i <= n; i++) {
              int len = i / 2 * 2;
              f2[i][0] = f2[i - 1][0];
              for (int j = 1; j <= len; j++) {
                  f2[i][j] = f2[i - 1][j] + (len - j + 1) * f2[i - 1][j - 1];
             }
        }
        long long ans = 0;
        for (int i = 0; i <= k; i++)
              ans += f1[n][i] * f2[n][k - i];
        printf("%lld\n", ans);
       }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值