Codeforces 1110 D

题意:给\(n\)个麻将,每个麻将上有一个\(1..m\)的整数\(a_i\)。

现在要将这些麻将们分成一个一个三元组,有两种情况:

  • \([i-1,i,i+1]\)
  • \([i,i,i]\)

然后问最多能将这些麻将们分成多少个三元组。

思路1:

结论:对于每一个三元组\([i-1,i,i+1]\),其出现的次数不会超过两次

证明:

我们如果有\(3\)个\([i-1,i,i+1]\)这种三元组,那么我们可以将其转化成\([i,i,i]\)、\([i-1,i-1,i-1]\)、\([i+1,i+1,i+1]\)这\(3\)个三元组,得到同样的效果。

那么就可以考虑\(dp\)了。

考虑\(dp(i,j,k)\)表示当前已经到了第\(i+1\)个位,\([i-1,i,i+1]\)出现了\(j\)次,\([i-2,i-1,i]\)出现了\(k\)次,最多可以形成的三元组个数。至于状态为什么是这样呢,就是想我们的\(i\)麻将被分到了哪些三元组中,其中和前\(i+1\)个有关的就是这两个。

然后转移的话枚举\([i,i+1,i+2]\)这个三元组出现的次数\(l\),然后\(i\)麻将剩下可以供\([i,i,i]\)的三元组使用的数量就是\(cnt_i-j-k-l\),将\(dp(i+1,k,l)\)赋成\(dp(i,j,k)\)加上这个值\(/3\)再加上\(l\)就行了。

思路2:

我们不考虑\([i-1,i,i+1]\)出现了多少次,我们只考虑被\([i,i,i]\)的三元组用过了之后的\(i\)麻将还剩下多少个。事实证明这个不会超过\(9\)个。为什么呢?首先我们的\(i\)被\([i-2,i-1,i]\)用了最多两次,\([i-1,i,i+1]\)用了最多两次,又被\([i,i+1,i+2]\)用了最多两次,再剩下\([i,i,i]\)一次的余量。

然后也是考虑\(dp\)。\(dp(i,j,k)\)表示当前到了第\(i\)个麻将,\(i-1\)还剩下了\(j\)个,\(i-2\)还剩下\(k\)个。然后转移的时候枚举现在对于\([i-2,i-1,i]\)这个三元组用\(l\)个,肯定是小于等于\(j\)和\(k\)的,那么再看\(cnt_i\)用了\(l\)个后还剩下多少,剩下的如果全用\([i,i,i]\)还剩下多少,记这个值为\(x\),再看如果少用几个\([i,i,i]\)变成了多少,是\(x+3y\)个,其中\(x+3y\)应该小于等于\(cnt_i\)和\(9\)。

然后转移到\(dp(i+1,k,x+3y)\)就好辣。

【Codeforces 1110D】Jongmah的更多相关文章

  1. 【Codeforces 1110D】Jongmah FST分析

    Codeforces 1110 D FST分析 dotorya.FizzyDavid.MofK.gamegame.matthew99.chokudai.eddy1021.DBradac.Happy_N ...

  2. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  3. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  4. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  5. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  6. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  7. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  8. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  9. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

随机推荐

  1. Ant + Tomcat + Jenkins 实现自动化部署

    前言:博主资历尚浅,很多东西都还在刚起步学习的阶段,这几天开发任务比较轻,就在自己window系统下,模拟部署远程服务器,利用Jenkins + Ant + Tomcat 搭建了一个自动发布部署的环境 ...

  2. APP如何进行通信的

    什么是B/S架构(Browser/server):浏览器和服务器架构

  3. js之搜索框

    目标效果:点击搜索框,搜索框内提示信息消失,可输入搜索信息,点击搜索框外搜索框如果没提示信息或者为空时,显示搜索框提示信息,如果有搜索信息,显示搜索信息. 代码如下: <!DOCTYPE htm ...

  4. CSS3效果:实现气泡效果

    首先定义一个 <p class="speech"></p> 先给外层的容器添加样式: p.speech { position: relative; widt ...

  5. Hadoop shell命令

    1.FS Shell 调用文件系统(FS)shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI格式是scheme: ...

  6. 【代码笔记】Web-Javascript-JavaScript简介

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  7. 关于input的焦点事件

    关于input的焦点事件 $(".scanf_integral").focus(function(){//获取焦点//获取焦点后触发的事件 }) $(".scanf_in ...

  8. php使用PHPexcel类读取excel文件(循环读取每个单元格的数据)

    error_reporting(E_ALL); date_default_timezone_set('Asia/ShangHai'); include_once('Classes/PHPExcel/I ...

  9. python自动化开发-6-常用模块-续1

    json和pickle模块:用于序列化的模块. 序列化:我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serializatio ...

  10. The ADB instructions

    adb kill-server 杀死adb服务. adb start-server 开启adb服务. adb install xxx.apk 安装应用. adb uninstall 应用的包名.卸载应 ...