格子刷油漆【动态规划问题】—NYOJ 980
个人博客页:https://www.scriptboy.cn/198.html
出处:蓝桥杯
题目描述:
X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。
你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。
c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当N较大时,结果会迅速增大,请把结果对 1000000007 (十亿零七) 取模。
输入:
输入数据为一个正整数(不大于1000)
输出:
输出数据为一个正整数。
样例输入:
|
|
2
3
22
|
样例输出:
|
|
24
96
359635897
|
思路:
固定起点,由于如果起点在中间(第2~N-1列)可以分为左右两边来讨论,这时起点都是角格子。假如
a[i]表示2*i的格子从左上角开始刷刷完所有格子的方案数(其中i表示列数,1<=i<=N),有三种刷法刷完所有格子:
- 先向下刷(即先刷左下角),向下刷完之后有两种方法跳到下一列,刷完剩下的
i-1列需要2*a[i-1];- 向下一列刷,最后刷左下角,可以看出不能同列刷,只能一直向右刷,且在没有到最后一列之前是不能返回,所以刷完所有格子有2^i个方案;(此种情况比较特殊,后面需要还要用到,所以单独用
b[i]存储下来)- 向下一列刷,有两种方案到下一列,然后返回左下角,再刷下一列未刷格子之后,然后有两种方案再到下一列,可见有四种方案到下下列,所以刷完所有格子有
4*a[i-2]个方案;总之,就是左下角格子什么时候刷,造成了不同的情况。如果是起点不在角格子上,不难看出,可以将左右两侧分割成
2*i和2*(N-i)的矩形,需要其中一个矩形使用第2种刷法刷才能回到另一个矩形中。参考:https://blog.csdn.net/roosevelty/article/details/50706322
AC代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long a[1005], b[1005], sum;
int main()
{
int N;
while(cin >> N)
{
sum = 0;
b[1] = 1;
for(int i = 2; i <= N; i++)
{
b[i] = b[i-1] * 2 % mod;
}
a[1] = 1;
a[2] = 6;
for(int i = 3; i <= N; i++)
{
a[i] = b[i] + a[i-2]*4 + a[i-1]*2;
a[i] %= mod;
}
sum += 4*a[N]; // 四个角的情况
// 中间为起点的情况
for(int i = 2; i < N; i++)
{
sum += (2*b[i]*2*a[N-i]+2*a[i-1]*2*b[N-i+1])%mod;
}
if(N == 1) sum = 2;
cout << sum %mod << endl;
}
return 0;
}
|
格子刷油漆【动态规划问题】—NYOJ 980的更多相关文章
- NYOJ 980 格子刷油漆 动态规划
这道题目状态转移方程比较复杂,刚开始以为没这么多情况,看了好多大牛的博客再加上与同学讨论才看懂,写下心得. 因为起点不固定,所以我们一个一个来考虑,先从角上考虑,设三个数组来表示分别为D,A,Sum, ...
- 算法笔记_185:历届试题 格子刷油漆(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可 ...
- 格子刷油漆(dp)-----------蓝桥备战系列
标题:格子刷油漆 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如图1所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但 ...
- Java实现蓝桥杯历届试题格子刷油漆
问题描述 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动 ...
- [蓝桥杯]PREV-15.历届试题_格子刷油漆
题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MOD ...
- hihoCoder #1055 : 刷油漆 [ 树形dp ]
传送门 结果:Accepted 提交时间:2015-05-11 10:36:08 #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到 ...
- HihoCoder第十二周:刷油漆
#1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球 ...
- hiho_1055_刷油漆
题目大意 一棵树,每个节点都有相应的value值.从根开始选择M个节点相互连通,使得这些节点的value值之和最大. 题目链接:[刷油漆][1] 题目分析 典型的树形dp,dp[i][j] 表示以节点 ...
- HihoCoder 1055 : 刷油漆 树形DP第一题(对象 点)
刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩具!这棵树玩具是由N个小球和N-1根木棍拼凑而成,这N个小球都被小Ho标上了 ...
随机推荐
- (十六)TableView常见属性
千万不要忘记设置TableView的数据源. 1.分割线的样式: separatorStyle与separatorColor. 颜色:十六进制表示 32bit:argb各占8位. #aarrggbb ...
- 《java入门第一季》之面向对象(包概述)
由于eclipse等ide的强大功能,使得建包,导包用一些快捷键就能完成.这里对包的概念做稍微的叙述,了解即可: 分包后使得项目更加清晰,提高代码维护性. 包: A:其实就是文件夹 ...
- rabbitMQ之AMQP协议
1.什么是AMQP协议 即高级消息队列协议,规范客户端与消息中间件服务器之间的通信,并能相互操作. 2.AMQP协议的作用 降低应用程序之间的耦合度,这样不同应用之间的集成的难度将变得更小,并开发出更 ...
- 为什么选择Nginx
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这 ...
- 集群通信组件tribes之使用方法
上面已经对tribes的内部实现机制及原理进行了深入的剖析,在理解它的设计原理后看看如何使用tribes,整个使用相当简单便捷,只需要四步: ① 定义一个消息对象,由于这个消息对象是要在网络之间传递的 ...
- 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化
仿百度壁纸客户端(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度 ...
- 学习C++模板,类模板
当我们使用向量时,会经常使用形如:vector<int> a的式子.这个表达式就是一个类模板实例化的例子,vector是一个类模板,我们给他传递模板参数(见<>里),然后创建一 ...
- c++ list 合并操作函数实例
#include <list> #include <iostream> using namespace std; //list 链表的打印 void print(list< ...
- ubuntu12.04:jdk7:手动安装
总的原则:将jdk-7u10-linux-x64.tar.gz压缩包解压至/usr/lib/jdk,设置jdk环境变量并将其修改为系统默认的jdk 将jdk-7u5-linux-x64.tar.gz拷 ...
- AVL树之 Java的实现
AVL树的介绍 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不 ...