有2*n只狼,编号为0到2*n-1。他们拍照时会排成两行,每行n只狼。一张照片好看,必须满足每一行的最大编号大于等于k。
每一张照片有一个特征序列,这个序列有n+2个元素,前n个元素分别是n列的列最大值,后两个元素分别是两行的行最大值。两张照片只有在特征序列不同时才被认为是不同的。
他们想知道可以拍多少张好看而又不同的照片。
const int M=2005,P=1e9+7;
class WolfHockeyTeamEasy {
public:
int dp[M][M];
//设有两行 第一行每列的值比第二行的小
//a为第一行的最大值 b为第二行的最大值
//因为一共有2*n个元素最大的元素为2*n-1==b于是n=(b+1)/2;
//dp的转移
//对于一个dp[a][b]如a=9 b=6的情况
//必有 9,8,7,?,? 位于第二行
// - - - . .
//<1>当6位于 - 时6的位置就确定了,于是第一行的需要考虑的元素就少了一个6
//<2>当6位于 . 时等价与第二行变成了9,8,7,6,? 贡献为dp[a][b-1];
int dfs(int a,int b){
if(b==1)return a<=1;
if(!a||a>b)return 0;
int &ans=dp[a][b];
if(~ans)return ans;ans=0;
ans=1ll*dfs(a-1,b)+dfs(a-1,b-2);
return ans%=P;
}
int count(int n, int k) {
memset(dp,-1,sizeof(dp));
int ans=0;
for(int i=k;i<=2*n-2;i++)
ans=(1ll*ans+dfs(i,2*n-1))%P;
for(int i=2;i<=n;i++)ans=(1ll*ans*i)%P;
return 2ll*ans%P;
}
};