车的放置

题目描述

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

车的放置

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

车的放置

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

输入输出格式

输入格式:

输入文件place.in的第1行为有5个非负整数a, b, c, d和k。

输出格式:

输出文件place.out包括1个正整数,为答案mod 100003后的结果。

输入输出样例

输入样例#1: 复制
2 2 2 2 2
输出样例#1: 复制
38

说明

【数据规模与约定】

对于部分数据,有b = 0;

对于部分数据,有a,b,c,d≤4。

对于100%的数据,a,b,c,d,k≤1000,且保证了至少有一种可行方案。

把图形左右翻转

令f[i][j]为前j列,放了i个车的方案,v[j]为第j列的高度

f[i][j]=f[i][j-1]+f[i-1][j-1]*(v[j]-i+1)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int Mod=100003;
 7 int a,b,c,d,k;
 8 long long f[1001][2001],v[2001];
 9 int main()
10 {int i,j;
11     cin>>a>>b>>c>>d>>k;
12     for (i=1;i<=c;i++)
13     v[i]=d,f[0][i]=1;
14     for (i=c+1;i<=a+c;i++)
15     v[i]=b+d,f[0][i]=1;
16     f[0][0]=1;
17     for (j=1;j<=a+c;j++)
18     for (i=1;i<=k;i++)
19     f[i][j]=(f[i][j-1]+f[i-1][j-1]*(v[j]-i+1))%Mod;
20     cout<<f[k][a+c];
21 }