一、原题链接

Problem - 2045 (hdu.edu.cn)

二、题面

人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:

有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

以上就是著名的RPG难题.

如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?

三、示例

  1. 输入

    • 输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
    • 1
      2
  2. 输出

    • 对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
    • 3
      6

五、思路

  1. 动态规划使用条件

    • 无后效性

      • 将集合的表达定义为arr[n]:n个方格的有效排列数

        后效性:对于一个n格的有效排列,第n格的颜色不单要求与第n-1格不同,还要求与第一格不同

      • 将集合的表达定义为arr[n][i][j]:n个方格第一个颜色为i最后一个颜色为j,故问题转换为了求n格方格且相邻两个颜色不同的可能数,在输出结果时仅输出两个不同颜色的结果之

        注:增加维度本质还是分类讨论

    • 最优子结构:由上,显然对于目标问题n个相邻颜色不同的方格排列,有子问题n-1个相邻颜色不同的方格排列必然成立

    • 重复子问题:无

  2. 动态规划模型构建

    • 集合表达

      ans[55][3][3]

      • 第一维表示方格数
      • 第二维表示起始颜色
      • 第三维表示结束颜色
    • 递推式:n个方格的排列可由n-1个方格推得

      for(int i=2;i<=50;i++){
      for(int j=0;j<3;j++){
      ans[i][j][j]=ans[i-1][j][(j+1)%3]+ans[i-1][j][(j+2)%3];
      ans[i][j][(j+1)%3]=ans[i-1][j][j]+ans[i-1][j][(j+2)%3];
      ans[i][j][(j+2)%3]=ans[i-1][j][j]+ans[i-1][j][(j+1)%3];
      }
      }
    • 初值确定:由递推式可知,只需知道1个方格的排列

      for(int i=0;i<3;i++){
      ans[1][i][i]=1;
      }

六、code

#include <bits/stdc++.h>

#define PI 3.1415927

using namespace std;
typedef long long ll; int main()
{
ll n,ans[55][3][3];
memset(ans,0,55*3*3*sizeof(ll));
//求n个相邻颜色不同的方格排列
for(int i=0;i<3;i++){
ans[1][i][i]=1;
}
for(int i=2;i<=50;i++){
for(int j=0;j<3;j++){
ans[i][j][j]=ans[i-1][j][(j+1)%3]+ans[i-1][j][(j+2)%3];
ans[i][j][(j+1)%3]=ans[i-1][j][j]+ans[i-1][j][(j+2)%3];
ans[i][j][(j+2)%3]=ans[i-1][j][j]+ans[i-1][j][(j+1)%3];
}
}
while(cin >> n){
//求n个相邻颜色不同且收尾颜色不同的方格排列
ll num=0;
for(int i=0;i<3;i++){
if(n==1){
num+=ans[n][i][i];
}
num+=ans[n][i][(i+1)%3];
num+=ans[n][i][(i+2)%3];
}
cout << num << endl;
}
return 0;
}

HDU 2045:不容易系列之(3)—— LELE的RPG难题(动态规划)的更多相关文章

  1. HDU 2045 不容易系列之(3)—— LELE的RPG难题(递归/动态规划)

    不容易系列之(3)—— LELE的RPG难题 Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即" ...

  2. HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推)

    题意:有排成一行的n个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. 题解:本来当n=1时, ...

  3. hdu 2045 不容易系列之(3)—— LELE的RPG难题

    解题思路: f(n)=1,2,.....n-2,n-1,n 前n-2个已经涂好,那么n-1有两种可能 1.n-1与n-2和1 的颜色都不同 1 粉,   n-2 红,   n-1 绿.  那么n的颜色 ...

  4. HDU 2045 不容易系列之(3)—— LELE的RPG难题 (递推)

    题意:略. 析:首先是假设前n-2个已经放好了,那么放第 n 个时,先考虑一下第 n-1 放的是什么,那么有两种情况. 如果n-1放的是和第1个一样的,那么第 n 个就可以在n-2的基础上放2个,也就 ...

  5. HDU 2045 不容易系列之(3)—— LELE的RPG难题(递推)

    点我看题目 题意 : 中文题不解释. 思路  :先算了第3个第4个,算的时候发现只要在已经枚举出来的前边的状态中往后添加字母就行了,如果两个的都已经表示出来了,那第三个就可以在每个第二个后边加一个,在 ...

  6. HDU 2045 不easy系列之(3)—— LELE的RPG难题

    思路: 1.若前n-1位涂的颜色是符合条件的,则因为首尾不同,再加入一位时,仅仅有1种方法:即s[n] = s[n-1] 2.若前n-1位组成的串不符合,再加入一位后合法.即由于首尾同样而引起的不合法 ...

  7. hdoj 2045 不容易系列之(3)—— LELE的RPG难题

    不容易系列之(3)—— LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  8. 2045不容易系列之(3)—— LELE的RPG难题

    Problem Description人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即”可乐”),经过多方打探,某资深Cole终于知道了原因,原 ...

  9. Hdoj 2045.不容易系列之(3)—— LELE的RPG难题 题解

    Problem Description 人称"AC女之杀手"的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多"Cole"(LELE的粉丝,即"可乐 ...

  10. 【HDOJ】2045 不容易系列之(3)—— LELE的RPG难题

    着色问题,递推,当超过3个块时,规律明显,此时可以是n-2的头尾重复+与头尾不同颜色,也可以是n-1+与头尾均不相同眼色情况.经典递推.注意long long. #include <stdio. ...

随机推荐

  1. 写好C#代码的技巧

    写好C#代码的技巧 编者导语 本文来自https://www.pluralsight.com,作者Afzaal Ahmad Zeeshan. 原文包含以下三篇文章: <编写更好的C#代码简介&g ...

  2. Base64编码的优点与缺点

    Base64编码是一种将二进制数据转换为可打印ASCII字符的编码方式.它被广泛应用于数据传输和存储,以提升数据的可读性.可传输性和安全性. Base64编码解码 | 一个覆盖广泛主题工具的高效在线平 ...

  3. OI中的一些数学小技巧

    在OI比赛中,如果能够灵活地运用一些数学小技巧,是能够很好地优化计算的时间和正确性的. 既然说了是小技巧,那么这些指的都是一些技巧,一般是不会单独成题的. 本博客或会随着作者的见识而更新 Better ...

  4. Ubuntu18.04 Server部署Flannel网络的Kubernetes

    准备服务器 ESXi6.5安装Ubuntu18.04 Server, 使用三台主机, 计划使用hostname为 kube01, kube02, kube03, 配置为2核4G/160G, K8s要求 ...

  5. valueOf与toString

    valueOf与toString valueOf和toString是Object.prototype上的方法,在Js几乎所有的对象都会继承自Object,同样由于包装对象的原因,几乎所有的数据类型都能 ...

  6. python基础安装虚拟环境

    1.pip install virtualenv或者pip3 install virtualenv 2.在要存放虚拟环境的地方创建一个venv文件夹,用来存放所有创建的虚拟环境,方便查找与管理 3.m ...

  7. 【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误

    在使用应用程序访问Key Vault获取密钥信息时,现后遇见了多种认证错误.使用的代码为: String keyVaultUrl = "https://test-xxx.vault.azur ...

  8. 浅入 ABP 系列(7):对象映射

    目录 基础 DTO和实体 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误 ...

  9. STM32SPIFLASH读写

    STM32SPIFLASH读写 1.1 SPI注意事项 SPI是同步通信,即通信双方每次信息交互必会带有一问一答,这代表在正常的单核MCU(例如STM32)中很难实现软件模拟的双向SPI通信(TFT屏 ...

  10. 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题

    django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题.如何解决请继续看. sched ...