hdu6578 2019湖南省赛D题Modulo Nine 经典dp
@
题目


第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字。
第二题题意是10个数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]数字的乘积必须是9的倍数。
解析
- hdu6578
- \(dp[t][i][j][k]\)表示填完前\(t\)个位置,{\(0,1,2,3\)}中出现的数字最后一次出现的位置排序后为\(t,i,j,k(t\gt i\gt j\gt k)\)的方案数。\(0\)表示数字未出现。
- 枚举四种转移:
- 填\(t-1\)位置的数字:\(dp[t][i][j][k]\)
- 填\(i\)位置的数字:\(dp[t][t-1][j][k]\)
- 填\(j\)位置的数字:\(dp[t][t-1][i][k]\)
- 填\(k\)位置的数字:\(dp[t][t-1][i][j]\)
- 但是不是所有转移都有效,所以要枚举限制条件,将不合法的转移pass掉
- 枚举所有终点在\(t\)点的限制条件,将不合法的转移的\(dp\)值归零。
- 时间复杂度:\(O(n^4)\),滚动数组优化空间复杂度:\(O(n^3)\)
- 2019湖南省赛D题Modulo Nine
- 关于乘积是否是9的倍数,这里只有3类数字,0和9表示两个3,3和6表示一个3,其他表示零个3
- \(dp[t][i][j]\)表示填完前\(t\)个位置,最后一个3在\(i\),倒数第二个3在\(j\)的方案数。
- 枚举3种转移:
- 填\(0或9\):\(dp[t][t][t]\)
- 填\(3或6\):\(dp[t][t][i]\)
- 填其他数字:\(dp[t][i][j]\)
- 但是不是所有转移都有效,所以要枚举限制条件,将不合法的转移pass掉
- 枚举所有终点在\(t\)点的限制条件,将不合法的转移的\(dp\)值归零。
- 时间复杂度:\(O(n^3)\),滚动数组优化空间复杂度:\(O(n^2)\)
两题思路一模一样,是一种很经典的dp。
AC_Code
hdu6578
const int mod = 998244353;
const int MXN = 1e5 + 7;
const int MXE = 2e5 + 7;
int n, m, c;
vector<pii> mp[MXN];
LL dp[2][101][101][101];
void get_dp() {
dp[c][0][0][0] = 1;
for(int t = 1; t <= n; ++t) {
c ^= 1;
for(int i = 0; i <= t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) dp[c][i][j][k] = 0;
for(int i = 0; i < t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) {
if((i != j && j != k) || k == 0) {
dp[c][i][j][k] = (dp[c][i][j][k] + dp[c ^ 1][i][j][k]) % mod;
dp[c][t - 1][j][k] = (dp[c][t - 1][j][k] + dp[c ^ 1][i][j][k]) % mod;
dp[c][t - 1][i][j] = (dp[c][t - 1][i][j] + dp[c ^ 1][i][j][k]) % mod;
dp[c][t - 1][i][k] = (dp[c][t - 1][i][k] + dp[c ^ 1][i][j][k]) % mod;
}
}
for(int h = 0; h < (int)mp[t].size(); ++h) {
int l = mp[t][h].fi, x = mp[t][h].se;
for(int i = 0; i < t; ++i) for(int j = 0; j <= i; ++j) for(int k = 0; k <= j; ++k) {
int cnt = 1;
if(i >= l) ++ cnt;
if(j >= l) ++ cnt;
if(k >= l) ++ cnt;
if(cnt != x) dp[c][i][j][k] = 0;
}
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
//freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
int tim = read();
while(tim --) {
n = read(), m = read();
for(int i = 1, a, b, c; i <= m; ++i) {
a = read(), b = read(), c = read();
mp[b].eb(mk(a, c));
}
get_dp();
LL ans = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j <= i; ++j)
for(int k = 0; k <= j; ++k) if((i != j && j != k) || k == 0) ans = (ans + dp[c][i][j][k]) % mod;
printf("%lld\n", (ans+mod)%mod);
for(int i = 0; i <= n; ++i) mp[i].clear();
}
#ifndef ONLINE_JUDGE
cout << "time cost:" << clock() << "ms" << endl;
#endif
return 0;
}
2019省赛D
const int mod = 1e9 + 7;
const int MXN = 1e5 + 7;
const int MXE = 2e5 + 7;
int n, m, c;
int mp[MXN];
LL dp[2][101][101];
void get_dp() {
clr(dp, 0);
dp[c][0][0] = 1;
for(int t = 1; t <= n; ++t) {
c ^= 1;
for(int i = 0; i <= t; ++i) for(int j = 0; j <= i; ++j) dp[c][i][j] = 0;
for(int i = 0; i <= t; ++i) {
for(int j = 0; j <= i; ++j) {
dp[c][i][j] = (dp[c][i][j] + dp[c^1][i][j] * 6) % mod;
dp[c][t][i] = (dp[c][t][i] + dp[c^1][i][j] * 2) % mod;
dp[c][t][t] = (dp[c][t][t] + dp[c^1][i][j] * 2) % mod;
}
}
if(mp[t] == -1) continue;
for(int i = 0; i <= t; ++i) {
for(int j = 0; j <= i; ++j) {
if(i < mp[t] || j < mp[t]) dp[c][i][j] = 0;
}
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("/home/cwolf9/CLionProjects/ccc/in.txt", "r", stdin);
//freopen("/home/cwolf9/CLionProjects/ccc/out.txt", "w", stdout);
#endif
int tim = 1;
while(~scanf("%d%d", &n, &m)) {
for(int i = 1; i <= n; ++i) mp[i] = - 1;
for(int i = 1, a, b; i <= m; ++i) {
a = read(), b = read();
mp[b] = big(mp[b], a);
}
get_dp();
LL ans = 0;
for(int i = 0; i <= n; ++i) for(int j = 0; j <= i; ++j) ans = (ans + dp[c][i][j]) % mod;
printf("%lld\n", (ans + mod) % mod);
}
#ifndef ONLINE_JUDGE
cout << "time cost:" << clock() << "ms" << endl;
#endif
return 0;
}
hdu6578 2019湖南省赛D题Modulo Nine 经典dp的更多相关文章
- 2019湖南省赛H题——概率转移&&逆矩阵
题意 题目链接 Bobo有一个 $n+m$ 个节点的有向图,编号分别为 $1 \sim n$,他还有一个 $n$ 行 $n+m$ 列的矩阵 $P$. 如果在 $t$ 时刻他位于节点 $u(1 \leq ...
- 牛客集训 湖南省赛E题 Grid 动态开点线段树
国庆牛客集训的题,正好准备好好训练线段树,想起来就补一下. 题意很简单,两种操作行合并或者列合并,每个操作后计算有多少个子块. 这题应该先推导公式,行操作或者列操作只有一种的时候,很简单,总数就是n* ...
- 2018湖南省赛B题“2018”
题面懒得敲了,反正看这篇博客的肯定知道题面. 比赛时想按约数的一些性质分情况讨论出公式然后在合并,结果单考虑矩阵里出现2018和1009(与2互质,1009出现次数等于2)出现的情况就写了一长串公式, ...
- 2016湖南省赛--A题--2016
2016 [TOC] Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input ...
- zoj 4122 Triangle City 2019山东省赛J题
题目链接 题意: 给出一个无向图,类似三角形的样子,然后给出边的权值,问找一条从第一个点到最后一个点的路径,要求每一条边只能走一次,并且权值和最大,点可以重复走. 思路: 首先观察这个图可以发现,所有 ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- ZOJ 3949 (17th 浙大校赛 B题,树型DP)
题目链接 The 17th Zhejiang University Programming Contest Problem B 题意 给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ## [湖南省赛2019]Findme ###
[湖南省赛2019]Findme 1.题目概述 2.解题过程 010打开这几张图片 先简单分析一下这几张图片 简单分析 1.png 从外观上,1.png明显高度太低,需要更改 2.png 2.png末 ...
随机推荐
- html&css面试笔记
1.CSS选择器有哪些?它们的优先级是怎样的? 选择器类型: id选择器 ( # myid) 类选择器 (.myclassname) 标签选择器 (div, h1, p) 相邻选择器 (h1 + p) ...
- eclipse项目(java project)如何导入jar包的解决方案列表?
右键项目-properties-java build path(左侧菜单)-选择libraries 有两种方式,导入jar包实际上就是建立一种链接,并不是copy式的导入 一.导入外部包,add ex ...
- hbase centos7 安装体验
1. 准备需要jdk1.8,hbase安装文件.大家可以官网下载. 解压文件,复制到指定目录 tar -zxvf jdk-8u201-linux-x64.tar.gz tar -zxvf hbas ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- centos 7 安装 redis 及 php-redis 拓展
===============redis 安装========================== 直接yum 安装的redis 不是最新版本 yum install redis 如果要安装最新的re ...
- FWT公式一览
总表 真值表 对应运算 FWT IFWT A=B=0 A≠B A=B=1 左项 右项 左项 右项 0 0 1 & L+R R L-R R 0 1 0 ^ L+R L-R (L+R)/2 (L- ...
- python 装饰器 第四步:基本装饰器的实现
#第四步:基本装饰器的实现 #用于扩展基本函数的函数 def kuozhan(func): #内部函数(扩展之后的eat函数) def neweat(): #以下三步就是扩展之后的功能,于是我们把这三 ...
- Numpy基础之创建与属性
import numpy as np ''' 1.数组的创建:np.array([]) 2.数组对象的类型:type() 3.数据类型:a.dtype 4.数组的型shape:(4,2,3) 5.定义 ...
- 同一台机器上有多个Python版本?
有关Python网站上的官方文档,如何在Linux上的同一台机器上安装和运行多个版本的Python? 我可以找到大量的博客帖子和答案,但我想知道是否有“标准”官方方式这样做? 或者这完全取决于操作系统 ...
- HDU 3406 Baseball of Planet Pandora
Baseball of Planet Pandora Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...