蓝桥杯 格子刷油漆

问题描述
  X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。


  你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
  比如:a d b c e f 就是合格的刷漆顺序。
  c e f d a b 是另一种合适的方案。
  当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。
输入格式
  输入数据为一个正整数(不大于1000)
输出格式
  输出数据为一个正整数。
样例输入
2
样例输出
24
样例输入
3
样例输出
96
样例输入
22
样例输出
359635897

  这道题网上已经有AC的代码,但是我用了另一个思路来解这道题,所以记录一下,跟大家一起交流学习

  动态规划的题目关键就是找出递推关系,怎么从 n 推到 n+1

  这里先介绍几个我自己想的名词:零端,双端,单同,单异

  根据最右边的边缘包含几个端点,先分为零端(没有端点),单端(单个端点),双端(两个端点)

  其中,单端又根据 相对点跟这个端点有没有连线,分为单同(有连线)和单异(没连线)

 具体看图


由上图我们可以清晰得看到:

1个零端可以产生2个零端(这里以n=2递推到n=3作为例子)

 1个双端可以产生2个双端和4个单同

。。。。。。

所以  (a,b,c,d)->( 2a+2c,   2b,  4b+2c+2d, 2c)  就是我们要的递推式, 再一个求和取模就是答案了

比如当n=2时候 ,24种方案里面有4个零端,4个双端,8个单同,8个单异

所以(a,b,c,d)=(4,4,8,8)     ->   (2a+2c,2b,4b+2c+2d,2c)=(24,8,48,16)  

所以n=3方案数有  24+8+48+16=96

直接上代码

import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		long []g=new long[]{4,4,8,8};
		for(int i=0;i<n-2;i++)
		    g=f(g);
		System.out.println((g[0]+g[1]+g[2]+g[3])% 1000000007);
	}

	private static long[] f(long[] g) { 
		return new long[] { (2 * g[0] + 2 * g[2]) % 1000000007, (2 * g[1]) % 1000000007,(4 * g[1] + 2 * g[2] + 2 * g[3]) % 1000000007, (2 * g[2]) % 1000000007 };
	}
}


  在这里也贴一下之前已经有的代码,供大家交流学习 :点击打开链接

  之前网上的代码大抵都是这个思路,也全部能AC


 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值