JZOJ 2938. 【NOIP2012模拟8.9】分割田地

题面

分析

\(dp\) 的话设 \(f_{i,0/1}\) 表示第 \(i\) 列填的两个是否相同
那么接下来是很繁琐的转移
直接看代码吧

\(Code\)

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;

const LL P = 1e8 + 7;
int n , k;
LL f[1005][2005][2];

int main()
{
	scanf("%d%d" , &n , &k);
	f[1][1][1] = f[1][2][0] = 1;
	for(register int i = 2; i <= n; i++)
		for(register int j = 1; j <= min(2 * i , k); j++)
			f[i][j][1] = (f[i][j][1] + f[i - 1][j][1] + f[i - 1][j - 1][0] + f[i - 1][j - 1][1] + 2 * f[i - 1][j][0]) % P , 
			f[i][j][0] = (f[i][j][0] + 2 * f[i - 1][j - 1][0] + 2 * f[i - 1][j - 1][1] + f[i - 1][j][0] + 
							f[i - 1][j - 2][0] + f[i - 1][j - 2][1]) % P;
	printf("%lld" , (f[n][k][0] + f[n][k][1]) % P);
}
posted @ 2020-10-05 21:49  leiyuanze  阅读(112)  评论(0编辑  收藏  举报