HDU 2045:不容易系列之(3)—— LELE的RPG难题(动态规划)

1|0一、原题链接


Problem - 2045 (hdu.edu.cn)

2|0二、题面


人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题: 有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. 以上就是著名的RPG难题. 如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?

3|0三、示例


  1. 输入

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

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

4|0五、思路


  1. 动态规划使用条件

    • 无后效性

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

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

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

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

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

    • 重叠子问题:对于三个颜色中的任一颜色的第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; }

5|0六、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; }

__EOF__

本文作者Arno
本文链接https://www.cnblogs.com/Arno-vc/p/18085221.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Arno_vc  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示