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);
}
原文地址:https://www.cnblogs.com/leiyuanze/p/13771751.html