• [题解]洛谷P1350车的放置


    题目链接:车的放置

    题目描述:

    有下面这样的一个网格棋盘,a,b,c,d表示了对应边长度,也就是对应格子数。

    当a=b=c=d=2时,对应下面这样一个棋盘

    要在这个棋盘上放K个相互不攻击的车,也就是这K个车没有两个车在同一行,也没有两个车在同一列,问有多少种方案。同样只需要输出答案mod 100003后的结果。

     解题思路:

    这个图形不太规整,但还是可以dp来写,需要先记录每一列的高度,记为lim【[i],dp[i][j]表示从后往前到了第i列,选了j个的方案数。对于限制条件,可以从大区间中减去小区间来处理,dp方程:f[i][j]=(f[i-1][j]+((lim[i]-j+1)*f[i-1][j-1])%mod)%mod;

    代码:

    #include<bits/stdc++.h>
    #define ll long long 
    #define R register
    using namespace std;
    const int N=2e3+5;
    int a,b,c,d,k,f[N][N],mod=1e5+3,lim[N];//后 i 列, 选了 j 个的 方案数
    int main(){
        memset(f,0,sizeof(f));
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        for(R int i=1;i<=c;i++)lim[i]=d,f[i][0]=1;
        for(R int i=c+1;i<=a+c;i++)lim[i]=b+d,f[i][0]=1;
        f[0][0]=1;
        for(R int i=1;i<=a+c;i++)
        for(R int j=1;j<=i;j++)
        f[i][j]=(f[i-1][j]+((lim[i]-j+1)*f[i-1][j-1])%mod)%mod;
        printf("%d",f[a+c][k]);
        // i=     1     ------->     n
        // j=     1     -------->    i;
        //f[i][]]=f[i-1][j]+(lim[i]-j+1)*f[i-1][j-1];
        return 0;
    }
  • 相关阅读:
    多态小结
    Lambda小结
    网络编程小结
    内部类与Lambda
    线程小结
    关于java的静态绑定与动态绑定小结
    多线程
    英语语法十二(可数名词不规则变化)
    英语语法入门十四(名词的作用)
    英语语法入门十三(不可数名词)
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9828187.html
Copyright © 2020-2023  润新知