Codeforces Round #594 (Div. 1) A. Ivan the Fool and the Probability Theory(DP+数学)

题目链接
在这里插入图片描述
题意:给定一个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); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值