题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578

题意:

给你n个空的数列位置和k条限制,要你用0 1 2 3四个数字,每条限制由l r x组成, 表示你构成的数列在区间l到r的范围内至少有x个不同的数字,问你有多少数组的构成方式。

做法:

我们能发现的是,其实区间内的数的表示只和数的最后出现位置有关系,但可能有人会说123和321肯定是不一样的方式啊,是的,但是这在转移的过程中会有顺序的出现,最后肯定都是会归到答案里的。一会儿再举例子。

先说dp方程, 表示四个数字在排序之后(即已经确定i>=j>=k>=z)的最后一个出现位置为i,j,k,z的方案数,因为i是最大的数字,那么我们只要看r是i的那些限制条件是否满足就可以,即i j k z大于等于L的数量是不是等于x即可,如果可以,那么我们就将当前位置i j k z加到下一个状态,如把当前在j位置的数字加到i+1,那么就是加到i+1 i k z 四个位置(因为j已经变成了i+1)。

再来说例子,假设我们要在三个空白的位置上放上3个不同的数,那么一开始肯定都是从0 0 0 0开始的,转移到1 0 0 0的时候会有四次,即将第1 2 3 4    四个位置上的0变成1的过程,但这都是合法的所以最后1 0 0 0 状态会等于4(这也就代表第1个位置可以放上四个数),因为最后合法的肯定是3 2 1 0 所以我就直接看转移到 2 1 0 0 的数了, 2 1 0 0肯定是从1 0 0 0的后三个0的任意位置转移过来,即 (2 1 0 0) = 3*(1 0 0 0)= 12 ,最后的 (3 2 1 0)同理肯定是从(2 1 0 0)来的,而有两个来的方式,那么就是(3 2 1 0)=2 * (2 1 0 0)=24。例子不大手模一下也快的答案也就是24.


#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=105;
const int mod=998244353;
ll dp[2][maxn][maxn][maxn],ans;
int n,m;
vector<pii> L[maxn];
void add(ll &a,ll b){a=a+b;if(a>mod) a-=mod;
}
inline bool ck(int a,int b,int c,int d){for(int i=0;i<L[a].size();i++){pii x=L[a][i];int ll=x.first;int num=1+(b>=ll)+(c>=ll)+(d>=ll);if(num!=x.second) return 0;}return 1;
}
int main(){int T;scanf("%d",&T);while(T--){memset(dp,0,sizeof(dp));scanf("%d%d",&n,&m);rep(i,1,n) L[i].clear();rep(i,1,m){int l,r,nu;scanf("%d%d%d",&l,&r,&nu);L[r].push_back({l,nu});}int p=1;dp[p][0][0][0]=1;ans=0;rep(i,1,n){p^=1;rep(j,0,i)rep(k,0,j)rep(z,0,k)dp[p][j][k][z]=0;rep(j,0,i)rep(k,0,j)rep(z,0,k){if(ck(i,j,k,z)) add(dp[p][j][k][z],dp[p^1][j][k][z]);//将原来在i位置上的数字加到i+1位置上 那么最大的发生变化而其他不变if(ck(i,i-1,k,z)) add(dp[p][i-1][k][z],dp[p^1][j][k][z]);if(ck(i,i-1,j,z)) add(dp[p][i-1][j][z],dp[p^1][j][k][z]);if(ck(i,i-1,j,k)) add(dp[p][i-1][j][k],dp[p^1][j][k][z]);//将原来在z位置上的数字加到i+1上 其他不变 z变为i+1}}rep(i,0,100)rep(j,0,i)rep(k,0,j)add(ans,dp[p][i][j][k]);printf("%lld\n",ans);}return 0;
}

hdu 6578 Blank dp求 给定区间中数字不同的方案数相关推荐

  1. HDU - 6578 Blank DP + 滚动数组

    HDU - 6578 Blank 题意 给你\(\{0,1,2, 3\}\)四个数,分别填入长度为\(n\)的数列中,有\(m\)个限制条件,\(l_{i}, r_{i}, x_{i}\)表示在\([ ...

  2. HDU 6578. Blank (DP)

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: N个位置,M个限制条件: 每个位置填入{0,1,2,3}中的一个数: 每个限制条件(L,R ...

  3. HDU - 6578 Blank dp

    Blank dp[ o ][ i ][ j ][ k ] 表示前 o 个已经填完, 不同数字的最后一个分别在o, i, j, k, 直接dp, 把限制丢到R, 在R转移出去的时候把不合法的丢掉. #p ...

  4. hdu 6578 Blank dp

    题意 n个格子排成一行,每个格子可以涂四种颜色. 给m个形如(l,r,x)的限制,表示l到r格子内恰好有x种颜色 问满足所有限制的涂色方法有多少种 n<=100,m<=100 做法 dp, ...

  5. 组合数学-容斥原理-求指定区间内与n互素的数的个数

    求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...

  6. C语言简单题-求整数序列中出现次数最多的数

    7-2 求整数序列中出现次数最多的数 (15分) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数.数字 ...

  7. 7-55 求整数序列中出现次数最多的数 (15 分)

    7-55 求整数序列中出现次数最多的数 (15 分) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数. ...

  8. HDU 6578 Blank

    题目大意:长度为n的数组要求分别填入0到3四个数中的任意一个,有m个限制条件:区间[l,r]中出现的数字种数恰好为x,求方案数. 记录4种数字最后出现的位置在限制条件下的方案数(及时清零)然后DP. ...

  9. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数...

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...

最新文章

  1. 《中国人工智能学会通讯》——5.31 制造服务的产生与聚合
  2. extern C的主要作用简单解释
  3. 1779: 无法言表(map+queue)
  4. echarts tooltip被遮挡_echarts 的tooltip定位到当前图,避免溢出和遮挡
  5. 一个完整的c语言的单链表代码,单链表完整C语言纯代码.docx
  6. Preferences偏好设置
  7. 软件测试知识——Linux常用命令
  8. 欧美游戏业者都挣多少钱
  9. 华为云下docker安装svn
  10. 一文看懂信用额度管理体系(三连)
  11. [数据科学]000.我为什么当数据科学家
  12. 笔记本电脑用久了卡顿解决方法
  13. 仿淘宝购买详情页购买缩小动画
  14. 为什么OpenCV计算的帧率是错误的?
  15. JavaScript的迭代器与生成器
  16. Mybatis分页插件MybatisHelper的使用
  17. 遨博机器人展示_遨博协作机器人
  18. Java Springboot切面+注解实现数据脱敏
  19. 梦幻服务器最新开服时间,梦幻西游新服开服时间表2021是什么_2021新服开服时间表介绍...
  20. flink sql 从mysql读数据写入到mysql实践

热门文章

  1. 知识图谱系统课程笔记(二)——知识抽取与挖掘
  2. java怎么绘制魔方外观,AI简单绘制立体魔方教程
  3. 微信点餐小程序分析与开发
  4. 怎样把游戏从计算机卸载了,电脑桌面上的游戏怎么卸载,电脑桌面上的游戏怎么卸载?...
  5. 图片的居中定位和按钮定位
  6. Dapp 众筹项目1 合约代码编写
  7. 微信小程序实现3D轮播图
  8. C++记录程序运行时间5大方法
  9. 企业面临大危机,CRM崩溃告急,程序员竟用特殊手段化解危机!
  10. 阿里云虚拟主机项目根目录指向public目录下