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

计数问题想到dp不过分吧...

dp[i][j][k][w]为第1-i位置中4个数最后一次出现的位置从大到小排列后为i>=j>=k>=w,但是会MLE,所以把i滚动掉。

但是这里有限制条件,把所有限制条件按右端点用vector存一下,然后处理到第i个位置时,枚举每个状态和限制条件,如果当前状态不满足则归0。

 1 #include <algorithm>
 2 #include<iostream>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <cstring>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn = 100 + 5;
 9 const int mod = 998244353;
10 int n, m, ans;
11 int dp[2][maxn][maxn][maxn];
12 vector <pair<int, int>> a[maxn];
13 int main() {
14     int pos;
15     cin >> pos;
16     while (pos--) {
17         int ans = 0;
18         scanf("%d %d", &n, &m);
19         for (int i = 1; i <= n; i++)
20             a[i].clear();
21         for (int i = 0; i < m; i++) {
22             int l, r, x;
23             scanf("%d%d%d", &l, &r, &x);
24             a[r].push_back(pair<int, int>(l, x));
25         }
26         dp[0][0][0][0] = 1;
27         int now = 1;
28         for (int i = 1; i <= n; i++, now ^= 1) {
29             for (int j = 0; j <= i; j++)
30                 for (int k = 0; k <= j; k++)
31                     for (int t = 0; t <= k; t++)
32                         dp[now][j][k][t] = 0;
33             for (int j = 0; j < i; j++)
34                 for (int k = 0; k <= j; k++)
35                     for (int t = 0; t <= k; t++) {
36                         dp[now][j][k][t] = (dp[now ^ 1][j][k][t] + dp[now][j][k][t]) % mod;
37                         dp[now][i - 1][k][t] = (dp[now ^ 1][j][k][t] + dp[now][i - 1][k][t]) % mod;
38                         dp[now][i - 1][j][t] = (dp[now ^ 1][j][k][t] + dp[now][i - 1][j][t]) % mod;
39                         dp[now][i - 1][j][k] = (dp[now ^ 1][j][k][t] + dp[now][i - 1][j][k]) % mod;
40                     }
41             for (int j = 0; j < i; j++)
42                 for (int k = 0; k <= j; k++)
43                     for (int t = 0; t <= k; t++)
44                         for (auto tmp : a[i])
45                             if (1 + (j >= tmp.first) + (k >= tmp.first) + (t >= tmp.first) != tmp.second)
46                                 dp[now][j][k][t] = 0;
47         }
48         now = n & 1;
49         for (int i = 0; i < n; i++)
50             for (int j = 0; j <= i; j++)
51                 for (int k = 0; k <= j; k++)
52                     ans = (ans + dp[now][i][j][k]) % mod;
53         printf("%d\n", ans);
54     }
55
56 }

View Code

转载于:https://www.cnblogs.com/sainsist/p/11304699.html

[2019杭电多校第一场][hdu6578]Blank(dp)相关推荐

  1. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  2. 2019杭电多校第一场 HDU 6599

    题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...

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

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

  4. 2022“杭电杯”中国大学生算法设计超级联赛 (1) 杭电多校第一场 2 3 4 5 8 12

    题目 1002 Dragon slayer 标程 1003 Backpack AC代码 1004 Ball AC代码 1008 Path AC代码 1009 Laser AC代码 1012 Alice ...

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

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

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

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

  7. 杭电多校第一场第三题 Backpack(异或dp+bitset)

    问题描述 爱丽丝有一个容量背包m她现在想用一些物品填充! 爱丽丝有n项目,每个项目都有一个卷v我和值w我. 是否可以从n个项目中选择多个项目,以使背包完全装满(即体积的总和等于背包容量)?如果是这样, ...

  8. 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量

    hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...

  9. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  10. 2022 杭电多校 第一场

    文章目录 1011 Random 1012 Alice and Bob 1003 Backpack 1002 Dragon slayer 1009 Laser 1011 Random 签到 求一下期望 ...

最新文章

  1. Android 自定义 —— View moveTo与 rMoveTo 的区别
  2. 混合云部署MySQL集群_数据库混合云解决方案
  3. CSU 1081集训队分组(搜索)
  4. 计算机网络 实验 使用端口完成地址转换,Wireshark抓包工具计算机网络实验解析...
  5. 无法获取 vmci 驱动程序版本: 句柄无效
  6. 64位windows系统如何显示32位dcom组件配置
  7. 数据预处理与数据分类预测
  8. 拼多多再添新瓜!15 岁上浙大、22 岁获世界冠军的天才黑客 Flanker 疑因拒绝违法攻击被强制开除...
  9. mysql数据库undo日志恢复_MySQL的undo/redo日志和binlog日志,以及2PC
  10. 开源同步文件软件对比
  11. 记一次跟二房东公司(非中介个人房源无中介费)租房的经历
  12. 鼠标双击桌面上的快捷方式出现打开本快捷方式属性,而不是打开文件的可能原因及解决方法参考...
  13. 残差分析(残差原理与标准化残差分析)
  14. 1-(2-甲氧基乙基)-3-乙基咪唑三氟甲基磺酸盐{[C22O1IM][TfO]}离子液体
  15. 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
  16. 2021 Google 开发者大会进行时: 汇聚开发者合力,共建全球技术生态
  17. 粉条要经过什么检查才符合315?
  18. 1213:八皇后问题1700:八皇后问题
  19. 如何借助企业微信运营管理用户?
  20. HBase,phoenix

热门文章

  1. Delphi调用C#类库.doc
  2. 11行Python代码,盗取了室友的U盘内容
  3. 全球最厉害的14位程序员!你知道有哪几位?
  4. js先执行一个方法再往下执行_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__...
  5. 01.redis初识
  6. 我所见过的最简短、最灵活的javascript日期转字符串工具函数
  7. spring init
  8. php 调试环境配置
  9. 强大的反编译软件Hopper Disassembler for Mac控制流程图详解
  10. 067、如何部署Calico网络 (2019-04-10 周三)