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

  • 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==。
  • DP开四维,DP[i][j][k][2],最后一位开==滚动数组==,用来记录上一个字符串长度时各个位置信息(及滚动继承),i,j,k分别记录==三个字符==的位置,因为无论在什么情况下,必定有一位它最后的位置和字符串的长度相等,所以不用存在dp中,dp只用存三个字符的最后位置。
  • (注意,i,j,k只是按从小到大存储了字符最后出现的位置,而没有指定是哪个字符)
  • dp状态转移方程:
  • 解释:假设当前,0最后出现在i的位置,1最后出现在j的位置,2最后出现在k的位置,3最后出现在==字符串长度==(cur)的位置。在下一次新的情况中,当后一位加上0时,那么按照顺序新3的最后出现的位置为cur-1(即上一个字符串的长度),其余不变,按从小到大,顺序为dp[j][k][cur - 1][now],然后继承上一个。以此类推。
  • 关于限制条件,用一个vector存入,当发现不符合时候,讲对应的DP置换成0。最后符合长度N的所有DP相加即为答案。

题目链接.
参考大佬的代码

解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经排好序。

DP开四维,DP[i][j][k][2],最后一位开滚动数组,用来记录上一个字符串长度时各个位置信息(及滚动继承),i,j,k分别记录三个字符的位置,因为无论在什么情况下,必定有一位它最后的位置和字符串的长度相等,所以不用存在dp中,dp只用存三个字符的最后位置。

(注意,i,j,k只是按从小到大存储了字符最后出现的位置,而没有指定是哪个字符)

dp状态转移方程:

dp[i][j][k][now] += dp[i][j][k][last]; // now为当前状态,last为上一次的状态
dp[j][k][cur - 1][now] += dp[i][j][k][last];
dp[i][k][cur - 1][now] += dp[i][j][k][last];
dp[i][j][cur - 1][now] += dp[i][j][k][last];

解释:假设当前,0最后出现在i的位置,1最后出现在j的位置,2最后出现在k的位置,3最后出现在字符串长度(cur)的位置。在下一次新的情况中,当后一位加上0时,那么按照顺序新3的最后出现的位置为cur-1(即上一个字符串的长度),其余不变,按从小到大,顺序为dp[j][k][cur - 1][now],然后继承上一个。以此类推。

关于限制条件,用一个vector存入,当发现不符合时候,讲对应的DP置换成0。最后符合长度N的所有DP相加即为答案。

代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
const int mo = 998244353;
const int N = 107;
int dp[N][N][N][2];
vector<pair<int, int> > d[N];
int main()
{int t;scanf("%d", &t);while (t--) {int n, m;scanf("%d%d", &n, &m);int l, r, x;for (int i = 1; i <= n; i++) {d[i].clear();//d[i].push_back(make_pair(i, 1));}for (int i = 1; i <= m; i++) {scanf("%d%d%d", &l, &r, &x);d[r].push_back(make_pair(l, x));}memset(dp, 0, sizeof(dp));dp[0][0][0][0] = 1;for (int cur = 1; cur <= n; cur++) {int now = cur & 1;int last = now ^ 1;for (int i = 0; i <= cur; i++)for (int j = i; j <= cur; j++)for (int k = j; k <= cur; k++) dp[i][j][k][now] = 0;//i<j<k;for (int i = 0; i <= cur; i++)for (int j = i; j <= cur; j++)for (int k = j; k <= cur; k++) {dp[i][j][k][now] += dp[i][j][k][last];dp[j][k][cur - 1][now] += dp[i][j][k][last];dp[i][k][cur - 1][now] += dp[i][j][k][last];dp[i][j][cur - 1][now] += dp[i][j][k][last];dp[i][j][k][now] %= mo;dp[j][k][cur - 1][now] %= mo;dp[i][k][cur - 1][now] %= mo;dp[i][j][cur - 1][now] %= mo;}for (int i = 0; i <= cur; i++)for (int j = i; j <= cur; j++)for (int k = j; k <= cur; k++)for (auto re : d[cur]) {  //遍历d这个数组,写了一个类似标程的写法l = re.first, r = cur, x = re.second;if (( (i >= l) + (j >= l) + (k >= l) + (cur >= l) ) != x)dp[i][j][k][now] = 0;}}int ans= 0;for (int i = 0; i <= n; i++)for (int j = i; j <= n; j++)for (int k = j; k <= n; k++)(ans += dp[i][j][k][n & 1]) %= mo;printf("%d\n", ans%mo);}return 0;
}

2019年杭电多校第一场 1001题blank(DP)HDU6578相关推荐

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

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

  2. 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 ...

  3. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

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

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

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

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

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

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

  7. 2022 杭电多校 第一场

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

  8. 2022杭电多校第一场

    A String 题意:求s串1-i(1 <i <n)子串的贡献,贡献为公共前后缀相交并且相交部分长度为k的倍数的数量 题解做法是用exkmp求出s串与所有后缀的LCP后,设LCP为x,那 ...

  9. 2019年牛客多校第一场B题 Integration 定积分 裂项相消

    题目链接: https://ac.nowcoder.com/acm/contest/881/B 题解: 转发一个大佬的博客,裂项相消,很容易看懂. https://blog.csdn.net/dill ...

最新文章

  1. 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法
  2. access百度翻译 get_百度AI攻略:智能上色
  3. Opencv卷积滤波cvFilter2D-高通与低通
  4. php怎样加密文件,如何使用php加密大文件并通过命令行解密?
  5. hdu1245 两个权值的最短路
  6. shell脚本中的几个括号总结(小括号/大括号/花括号)
  7. OpenCV线特征Line Features
  8. Python基础学习四 函数
  9. Elasticsearch技术解析与实战(七)Elasticsearch批量操作
  10. linux 手动睡眠
  11. mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...
  12. java9 堆外内存_java堆外内存泄漏排查
  13. Java集合的ConcurrentModificationException
  14. python中none什么意思_如何理解Python中的None
  15. Vijos 1041题:神风堂人数
  16. 【java】输出素数
  17. Mongodb- paly中操作mongodb记录
  18. 案例6-1.3 哥尼斯堡的“七桥问题”
  19. 德州CC2640R2f蓝牙芯片学习笔记(二)代码框架
  20. RNN入门(三)利用LSTM生成旅游点评

热门文章

  1. java文件读取报(文件名、目录名或卷标语法不正确。)
  2. 基于STM32的游戏平台,其二TETRIS
  3. 双臂UR5的Gazebo配置
  4. 9-vulnhub靶机-Tr0ll-ssh-rsa-private-环境变量-缓冲区溢出提权
  5. 一篇文章让你解决sql报错check the manual that corresponds to your MySQL server version for the right syntax to
  6. Linux执行某些命令缺少libtinfo.so.5
  7. 韩剧《我的黄金光辉人生》观后感
  8. android行业调研报告,安卓手机应用商店市场用户调查报告
  9. Attention mask理解
  10. EL表达式中比较String类型数字的大小