2019年杭电多校第一场 1001题blank(DP)HDU6578
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相关推荐
- HDU-6578 Blank(DP)2019暑假杭电多校第一场
题意:一行有n个空格编号1~n; 每一个空格中填入0,1,2,3中的一个数字.且满足m个限制l,r,x:满足在区间[l,r]正好有x种不同的数字. 有多少种方法可以填充空格以满足所有条件? 思路:dp ...
- 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 ...
- 【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 ...
- 2019杭电多校第一场 Operation HDU - 6579
题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...
- 2019杭电多校第一场 HDU 6599
题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...
- 杭电多校第一场第三题 Backpack(异或dp+bitset)
问题描述 爱丽丝有一个容量背包m她现在想用一些物品填充! 爱丽丝有n项目,每个项目都有一个卷v我和值w我. 是否可以从n个项目中选择多个项目,以使背包完全装满(即体积的总和等于背包容量)?如果是这样, ...
- 2022 杭电多校 第一场
文章目录 1011 Random 1012 Alice and Bob 1003 Backpack 1002 Dragon slayer 1009 Laser 1011 Random 签到 求一下期望 ...
- 2022杭电多校第一场
A String 题意:求s串1-i(1 <i <n)子串的贡献,贡献为公共前后缀相交并且相交部分长度为k的倍数的数量 题解做法是用exkmp求出s串与所有后缀的LCP后,设LCP为x,那 ...
- 2019年牛客多校第一场B题 Integration 定积分 裂项相消
题目链接: https://ac.nowcoder.com/acm/contest/881/B 题解: 转发一个大佬的博客,裂项相消,很容易看懂. https://blog.csdn.net/dill ...
最新文章
- 打开word出现“您正试图运行的函数包含有宏或需要宏语言支持的内容。”的解决方法
- access百度翻译 get_百度AI攻略:智能上色
- Opencv卷积滤波cvFilter2D-高通与低通
- php怎样加密文件,如何使用php加密大文件并通过命令行解密?
- hdu1245 两个权值的最短路
- shell脚本中的几个括号总结(小括号/大括号/花括号)
- OpenCV线特征Line Features
- Python基础学习四 函数
- Elasticsearch技术解析与实战(七)Elasticsearch批量操作
- linux 手动睡眠
- mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...
- java9 堆外内存_java堆外内存泄漏排查
- Java集合的ConcurrentModificationException
- python中none什么意思_如何理解Python中的None
- Vijos 1041题:神风堂人数
- 【java】输出素数
- Mongodb- paly中操作mongodb记录
- 案例6-1.3 哥尼斯堡的“七桥问题”
- 德州CC2640R2f蓝牙芯片学习笔记(二)代码框架
- RNN入门(三)利用LSTM生成旅游点评
热门文章
- java文件读取报(文件名、目录名或卷标语法不正确。)
- 基于STM32的游戏平台,其二TETRIS
- 双臂UR5的Gazebo配置
- 9-vulnhub靶机-Tr0ll-ssh-rsa-private-环境变量-缓冲区溢出提权
- 一篇文章让你解决sql报错check the manual that corresponds to your MySQL server version for the right syntax to
- Linux执行某些命令缺少libtinfo.so.5
- 韩剧《我的黄金光辉人生》观后感
- android行业调研报告,安卓手机应用商店市场用户调查报告
- Attention mask理解
- EL表达式中比较String类型数字的大小