题目来源 HDU 6578

题意

总共有nnn个编号,每个编号可以填充一个数字,分别为{0,1,2,3}\{0,1,2,3\}{0,1,2,3}。有mmm个条件,每个条件组成为l,r,xl,r,xl,r,x表示在区间[l,r][l,r][l,r]内的不同数字的个数为xxx个。
问总共有多少种填充的方式,结果对998244353取模。

题解

定义dp[x][y][z][i]dp[x][y][z][i]dp[x][y][z][i]表示从前向后,当填充到第iii个格子的时候,4个数字最后出现的位置分别为x,y,z,ix,y,z,ix,y,z,i时的方案数。其中x≤y≤z≤ix\le y \le z\le ix≤y≤z≤i。最初始的状态,在x,y,z,ix,y,z,ix,y,z,i为0时取等号,表示目前所有的数字都没有出现。
数字的种类是不重要的,因为计算的过程已经把不同的数字组合方式计算进去了。重要的在填充第iii个格子的时候从第i−1i-1i−1的方案转移过来。

填充当前格子的时候,我们有四种数字的一个
如果我们填充的数字和xxx位置的数字是一样的,那么转移状态为
dp[x][y][z][i−1]→dp[y][z][i−1][i]dp[x][y][z][i-1] \rightarrow dp[y][z][i-1][i]dp[x][y][z][i−1]→dp[y][z][i−1][i]
所以dp转移方式为
dp[y][z][i−1][i]+=dp[x][y][z][i−1]dp[y][z][i-1][i] +=dp[x][y][z][i-1] dp[y][z][i−1][i]+=dp[x][y][z][i−1]

同样的方式,如果取的数字和yyy位置的数字是一样的。那么
dp[x][z][i−1][i]+=dp[x][y][z][i−1]dp[x][z][i-1][i] += dp[x][y][z][i-1]dp[x][z][i−1][i]+=dp[x][y][z][i−1]
类比如下
dp[x][y][i−1][i]+=dp[x][y][z][i−1]dp[x][y][i-1][i] += dp[x][y][z][i-1]dp[x][y][i−1][i]+=dp[x][y][z][i−1]
dp[x][y][z][i]+=dp[x][y][z][i−1]dp[x][y][z][i] += dp[x][y][z][i-1]dp[x][y][z][i]+=dp[x][y][z][i−1]

然后对于每一个以iii为右端点的区间,枚举状态检查是否满足条件。即每个编号的最后一次出现的时候是否在区间内,然后判断要求区间内的编号数和要求的编号数是否相同。

由于第4维是原始空间,则会爆掉规定内存,所以需要用滚动数组来优化内存。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;const int mod = 998244353;
int T;
int n,m;
long long dp[110][110][110][2];struct Position {int L;int num ;
};vector<Position> p[110];
int main()
{scanf("%d", &T);while(T--) {scanf("%d %d", &n, &m);for(int i = 0;i<110;i++) p[i].clear();for(int i = 0,l, r, x ;i< m;i++) {scanf("%d %d %d", &l, &r, &x);p[r].push_back({l, x});}dp[0][0][0][0] = 1;int cur = 1,pre = 0;for(int  i = 1;i<=n;i++) {for(int z = 0;z<=i;z++) {for(int y = 0;y<=z;y++) {for(int x = 0;x<=y;x++) {dp[x][y][z][cur] = 0;}}}for(int z = 0;z<i;z++) {for(int y = 0;y<=z;y++) {for(int x = 0; x<=y;x++) {long long temp = dp[x][y][z][pre];dp[x][y][z][cur] += temp ;dp[y][z][i-1][cur] += temp;dp[x][z][i-1][cur] += temp;dp[x][y][i-1][cur] += temp;dp[x][y][z][cur] %= mod ;dp[y][z][i-1][cur] %= mod;dp[x][z][i-1][cur] %= mod;dp[x][y][i-1][cur] %= mod;}}}for(unsigned int  pp = 0;pp < p[i].size(); pp++) {for( int z = 0;z< i;z++) {for(int y = 0;y<=z;y++) {for(int x = 0;x<=y;x++) {int temp = 1 + (z >= p[i][pp].L ? 1:0)+ (y >= p[i][pp].L ? 1:0)+ (x >= p[i][pp].L ? 1:0);if(temp != p[i][pp].num) {dp[x][y][z][cur] = 0;}}}}}swap(pre, cur);}long long ans  = 0;for (int z = 0;z<n;z++) {for(int y = 0;y<=z;y++) {for(int x = 0;x<=y;x++){ans += dp[x][y][z][pre];ans %= mod;}}}printf("%lld\n", ans);}return 0;
}

HDU6578——blank 动态规划相关推荐

  1. HDU-6578 Blank

    HDU-6578 Blank 联想(口胡)(可跳过) 限制为几种不一样的数->存每个数最后出现的位置 又是一道神仙DP题.但如果思路正确还是挺简单的. 由于限制是限制一个区间有几个不同的数,所以 ...

  2. 2019多校第一场 HDU6578 - Blank(DP,思维,滚动数组优化空间)

    链接:HDU6578 - Blank 题意: 有 n (≤100) 个格子,向其中填入 0.1.2.3 这4个数,但是有 m (≤100) 个限制 限制 l r x :表示 l ~ r 的格子内不同的 ...

  3. [hdu6578]Blank

    状态f[i][j][k][l]表示前i个数,四种数的最后一次出现的位置分别是i.j.k和l(i>j>k>l),判断所有第右端点为i的区间是否满足此要求(不满足重置为0),考虑第i+1 ...

  4. 2019HDU多校第一场 HDU6578 Blank

    http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意:一排有N个空格.空格从左到右依次为1.2.-.N. 汤姆正在用{0,1,2,3}中的一个数字填充每个 ...

  5. HDU-6578 Blank(DP)2019暑假杭电多校第一场

    题意:一行有n个空格编号1~n; 每一个空格中填入0,1,2,3中的一个数字.且满足m个限制l,r,x:满足在区间[l,r]正好有x种不同的数字. 有多少种方法可以填充空格以满足所有条件? 思路:dp ...

  6. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  7. CTC:围观大佬从语音/文字客观存在的 blank 发力,玩转前缀 + 动态规划,打造无缝衔接神经网络的不定长序列识别

    CTC: Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neura ...

  8. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  9. 动态规划——区间dp

    在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...

最新文章

  1. Storm 0.9安装指南
  2. NYOJ 631 冬季长跑
  3. P1352 没有上司的舞会
  4. 弹幕解析播放器json客户端解析后台管理源码
  5. centos-安装ifconfig
  6. 零基础学python看什么书好?
  7. linux下查找进程及终止进程操作的相关命令
  8. spring boot开发环境搭建
  9. TCP/IP协议简单介绍
  10. 《算法设计与分析 第2版 屈婉玲等》第五章习题答案
  11. Linux基础知识全面总结
  12. nod32升级问题解决(20080530)
  13. java毕业设计电影票网上订票系统Mybatis+系统+数据库+调试部署
  14. 什么是3d建模,3D建模师可以从事哪些职业?
  15. 永别了,91网站!宣布永久关闭
  16. OAI——单虚拟机多basic核心网部署
  17. 思科ccie网络工程师一定要里了解的网络拥塞及拥塞控制技术
  18. html 全屏播放swf,HTML - 如何使SWF全屏?
  19. 2010年IT10大好书榜(上半年刊)——国外引进篇
  20. 隔行变色小案例(5)

热门文章

  1. poi操作excel之填充数据、删除行
  2. Unity工程里的那些东西
  3. 网友反映学校计算机科学与工程学院教师,华南理工大学一院长被指篡改考生成绩 校方:四名涉事人员停职调查...
  4. 机器学习完整项目实战附代码(二):探索型数据分析+特征工程+建模+报告
  5. 2020机修钳工(中级)考试及机修钳工(中级)复审模拟考试
  6. 【专栏】国内外物联网平台初探(篇三:QQ物联·智能硬件开放平台)
  7. 力扣解法汇总2043-简易银行系统
  8. iphone计算机怎样打开声音,mac系统启动的时候咚声音怎么开启或关闭?
  9. Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 15
  10. 《VS如何解决Cannot find or open the PDB file问题》