首页 > 其他分享 >HDU 2045:不容易系列之(3)—— LELE的RPG难题(动态规划)

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

时间:2024-03-20 14:57:17浏览次数:15  
标签:HDU 2045 颜色 int ll LELE 排列 方格

一、原题链接

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,颜色,int,ll,LELE,排列,方格
From: https://www.cnblogs.com/Arno-vc/p/18085221

相关文章

  • HDU 2036:改革春风吹满地(多边形面积计算)
    一、原题链接Problem-2036(hdu.edu.cn)参考:如何编程计算任意多边形的面积?理解了之后发现好简单!_哔哩哔哩_bilibili二、题面“改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地。谢谢!(乐队奏乐)”话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题......
  • HDU 2056:Rectangles(两个矩形交点的性质)
    一、原题链接Problem-2056(hdu.edu.cn)二、题面Giventworectanglesandthecoordinatesoftwopointsonthediagonalsofeachrectangle,youhavetocalculatetheareaoftheintersectedpartoftworectangles.itssidesareparalleltoOXandOY.三、......
  • [HDU6647] Bracket Sequences on Tree 题解
    [HDU6647]BracketSequencesonTree题解一道纯靠自己推出来的换根\(dp+\)树哈希,写篇题解庆祝一下~~题意:给定一棵无根树,你可以任意选择根节点和遍历顺序,每次遍历时进入一个节点就标记一个(,离开一个节点就标记一个),问所有存在的括号序列有多少种,对998244353取模。先考虑根固......
  • 手把手教你免费用Flashduty做消息通知
    为什么需要消息通知?如果有重要的情况发生,希望能通过各种媒介通知我们。可以举几个例子:家里燃气费没有了,希望能有短信或者app通知api频繁500报错,希望及时感知,及时修复公司网站是https自签名证书,为了保证可用性,每天会有e2e测试保证证书的有效性,如果过期及时通知为什么不用腾......
  • 【题解】「HDU 7084」Pty loves string
    CQBZOJHDU7084不难想到把最终在\(S\)从中间分开,就变成了前后两个broder拼起来。考场重现:直接把所有的broder求出来,将相同长度的broder的下标存在一起,然后暴力匹配,最后还没来及优化。考场代码(除了fail树,其她其实都挺逼近正解正解是建出fail树(甚至搞忘还有这东......
  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......
  • 2045:【例5.13】蛇形填数
    1#include<bits/stdc++.h>2usingnamespacestd;3intmain(){4intn;5cin>>n;6inta[n][n],i=0,j=n-1,t=1;7memset(a,0,sizeof(a));8a[i][j]=1;9while(t!=n*n){10while(a[i+1][j]==0&&i+1&l......
  • 2045:【例5.13】蛇形填数
    #include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; intb=1,i=0,j=n-1,a[n][n]; for(inti=0;i<n;i++){ for(intj=0;j<n;j++){ a[i][j]=0; } } a[i][j]=1; while(b<n*n){ while(a[i+1][j]==0&&i+1<n){......
  • hdu5213
    我们看到双区间询问,可以想一下怎么转换成单区间询问这个用容斥原理写也非常简单\(f(L,V)\)指的是\(f(L,U-1)\)和\(f(R+1,V)\)指的是会发现中间被多减了一次,所以加回来有\(f(R+1,U-1)\)于是就转换成了单区间询问题目没有对序列进行修改,所以可以离线处理所有询问,使用莫队算......
  • hdu3929
    二项式定理有两个性质,第一个是高中就接触过的,即奇数项(这里的奇数项与题目的奇数项定义不同)和偶数项系数之和相同第二个也可以记住当然这也告诉我们:中途一旦产生进位了,那么\(1\)的个数就要变化了然后这个容斥原理是我无法理解的了,简单来说,就是先求每个\(a_i\)的子集,然后再......