NYOJ 980 格子刷油漆 动态规划
这道题目状态转移方程比较复杂,刚开始以为没这么多情况,看了好多大牛的博客再加上与同学讨论才看懂,写下心得。
因为起点不固定,所以我们一个一个来考虑,先从角上考虑,设三个数组来表示分别为D,A,Sum,分别表示为“从一个角开始然后回到同一列的对应位置的总个数”, “从一个角开始的总个数(包括回到对应位置和不回到对应位置)”, “表示总的个数”
1. 当回到对应位置时:
D[1] = 1,D[n] = 2 * D[n-1];
因为他可以有两种方式出去,最后再回来,如图(a), 图上是以右上角这个格子出发的,然后回到右下角这个格子,一共有两种方式出去。
2. 不一定回到对应位置时,就是一个角的总个数:
A[n] = D[n] + 2*A[n - 1] + 4 * A[n - 2];
其中, D[n]表示回到对应位置的,而A[n-1]这种情况如图(b)所示,先上对面去,然后再接着向前走,所以还是两种方式出去,后面这种表示挨着走完两列,就是前面没有的这种情况,一共有两种走法,但是每种走法又有两种出去的方式,所以是4种,如下图(c)表示的,黑色(1,2两种)的和红色的(3,4两种)箭头方向。
这只是其中一个角,因为只要n>2就有4个角,所以这个所有角的个数就是4*A[n];
3.当从中间位置开始走时:
假设从 i 开始走, 2*(2*D[i-1]*2*A[n-i] + 2*D[n-i]*2*A[i-1]),最后从2 - n-1 遍历一遍加起来
假设从 i 开始走,显然不能直接往下走,否则无法遍历所有点,应当是先遍历左边(右边)所有点,然后回到相对的点,然后遍历右边(左边)的点。注意先遍历的时候,必须是采用“遍历全体格子后回到与之相对的格子”的走法,否则无法遍历出发点正下方的点,而后遍历则不受限制。所以先往左走的 i 之前的方法总数就是D[i - 1], 之后A[n - i],同理可以推先往右走的。
附AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = ;
const long long mod = ;
long long D[N], A[N], Sum[N];//D数组表示从一个角出发,最后回到出发点的同一列所对应的那个格子的总个数,
//A数组表示所有一个角出发的总个数,Sum表示总的个数
int main()
{
D[] = ;
A[] = ;
A[] = ;//初始条件,从一个角开始所有的总数
Sum[] = ;//总数
Sum[] = ;
for (int i = ; i < N; i++)
D[i] = D[i - ] * % mod;
for (int i = ; i < N; i++)
A[i] = (D[i] + * A[i - ] + * A[i - ]) % mod;
for (int i = ; i < N; i++)
{
Sum[i] = * A[i] % mod;
for (int k = ; k < i; k++)
Sum[i] = (Sum[i] + * D[k - ] * A[i - k] % mod + * D[i - k] * A[k - ] % mod) % mod;
}
int n;
while (cin >> n)
{
cout << Sum[n] << endl;
} return ;
}
NYOJ 980 格子刷油漆 动态规划的更多相关文章
- 算法笔记_185:历届试题 格子刷油漆(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可 ...
- 格子刷油漆(dp)-----------蓝桥备战系列
标题:格子刷油漆 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如图1所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但 ...
- Java实现蓝桥杯历届试题格子刷油漆
问题描述 X国的一段古城墙的顶端可以看成 2*N个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆. 你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动 ...
- 格子刷油漆【动态规划问题】—NYOJ 980
个人博客页:https://www.scriptboy.cn/198.html 出处:蓝桥杯 题目描述: 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标上了 ...
随机推荐
- 8.模板方法模式-[Head First 设计模式]
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 要点: “模板方法”定义了算法的步骤,把这些步骤的实现延 ...
- 【NEERC 2003】有向图破坏
[题目描述] Alice和Bob正在玩如下的游戏.首先Alice画一个有N个顶点,M条边的有向图.然后Bob试着摧毁它.在一次操作中他可以找到图中的一个点,并且删除它所有的入边或所有的出边. Alic ...
- Log4j实现对Java日志的配置全攻略
1. 配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.rootLogger = [ level ] , appenderName1 , appenderName2 , ...
- 如何让Hadoop运行得更快一些
在数据处理方面,我们发现数据输入速度一般要比的数据处理速度快很多,这种现象在大多数据领域尤为明显.随着数据不断膨胀,相应的响应时间自然要有所增加,数据处理的复杂度也在不断提高.作为一个开发者,我们自然 ...
- JavaScript-学习一字符串
字符串可以存储一系列字符,如 "John Doe". 字符串可以是插入到引号中的任何字符.你可以使用单引号或双引号: 用于字符串的 + 运算符 + 运算符用于把文本值或字符串变量加 ...
- OC中的@interface和java中的区别以及 @implementation @protocol
java 在java中的interface是‘接口’的意思,而java的类声明用class,即接口用interface声明,类是用class声明,是两个独立的部分. 只有在类声明要实现某个接口时, ...
- Java获取ip地址的几种方法
以下内容介绍下java获取ip地址的几种思路. 1.直接利用java.net.InetAddress类获取,不过这种方法只在windows环境下有效,在linux环境下只能获取localhost地址( ...
- 使用putty登陆cygwin出现server unexpectedly ...error.解决方案
将cygwin安装目录下/etc/passwd中的passwd文件中user:unused:32707:10513:U-CYOU-INC\user,S-1-5-21-2645613570-259884 ...
- 转:聊聊并发(八)——Fork/Join框架介绍
1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...
- [转载] $\mathrm{Jordan}$标准型的介绍
本文转载自陈洪葛的博客$,$ 而实际上来自xida博客朝花夕拾$,$ 可惜该博客已经失效 $\mathrm{Jordan}$ 标准形定理是线性代数中的基本定理$,$ 专门为它写一篇长文好像有点多余$: ...