题目链接
题意:给定一个n*m网格,要求给格子涂色的时候每个格子与相邻的格子之间最多只有一个颜色相同,求有多少涂色方案。
思路:感觉这个题更多的还是规律吧,首先你要明白一点就是如果某一行的涂色方案已经决定了,那么整个网格的涂色方案也就确定了,也就是规定了第一行的涂色方案后,它对答案的贡献。发现不了这个规律,这个题基本就是白给QAQ。
知道了这个之后还是很简单的,我们要做的就是确定一行能用多少个涂色方案,dp【i】【0】为前i个格子涂成白色的方案,dp【i】【1】为前i个格子涂成黑色的方案,dp【i】【0】+dp【i】【1】=dp【i-2】【1】+dp【i-1】【1】+dp【i-2】【0】+dp【i-1】【0】,于是dp【i】=dp【i-1】+dp【i-2】,这个时候还要注意一下黑白相间的情况,当一行为黑白相间且第一个格子确定时,整行就可以确定了,所以黑白相间时的贡献就是dp【m】,答案为dp【n】+dp【m】-2。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+1;
const int mod=1e9+7;
ll dp[maxn];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
dp[1]=2;dp[2]=4;
for(int i=3;i<=max(n,m);++i)
dp[i]=(dp[i-1]+dp[i-2])%mod;
printf("%lld\n",(dp[n]+dp[m]-2+mod)%mod);
}