@

题目


第一题题意是一共有{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的更多相关文章

  1. 2019湖南省赛H题——概率转移&&逆矩阵

    题意 题目链接 Bobo有一个 $n+m$ 个节点的有向图,编号分别为 $1 \sim n$,他还有一个 $n$ 行 $n+m$ 列的矩阵 $P$. 如果在 $t$ 时刻他位于节点 $u(1 \leq ...

  2. 牛客集训 湖南省赛E题 Grid 动态开点线段树

    国庆牛客集训的题,正好准备好好训练线段树,想起来就补一下. 题意很简单,两种操作行合并或者列合并,每个操作后计算有多少个子块. 这题应该先推导公式,行操作或者列操作只有一种的时候,很简单,总数就是n* ...

  3. 2018湖南省赛B题“2018”

    题面懒得敲了,反正看这篇博客的肯定知道题面. 比赛时想按约数的一些性质分情况讨论出公式然后在合并,结果单考虑矩阵里出现2018和1009(与2互质,1009出现次数等于2)出现的情况就写了一长串公式, ...

  4. 2016湖南省赛--A题--2016

    2016 [TOC] Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. Input ...

  5. zoj 4122 Triangle City 2019山东省赛J题

    题目链接 题意: 给出一个无向图,类似三角形的样子,然后给出边的权值,问找一条从第一个点到最后一个点的路径,要求每一条边只能走一次,并且权值和最大,点可以重复走. 思路: 首先观察这个图可以发现,所有 ...

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

  7. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

  8. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  9. ## [湖南省赛2019]Findme ###

    [湖南省赛2019]Findme 1.题目概述 2.解题过程 010打开这几张图片 先简单分析一下这几张图片 简单分析 1.png 从外观上,1.png明显高度太低,需要更改 2.png 2.png末 ...

随机推荐

  1. JavaScript实现Word、Excel、PPT在线预览

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_27626333/article/d ...

  2. handler消息机制入门

    handler消息机制入门 为什么要用handle? 我们在网络上读取图片信息时,是不能把耗时操作放在主线程里面的,当我们在子线程中获取到了图片的消息的时候,我们就需要把这个数据传给主线程. 而直接使 ...

  3. mysql 查昨天前天上个月数据

    主要使用到DATE_SUB()函数作用:从DATE或DATETIME值中减去时间值(或间隔). 语法:DATE_SUB(start_date, INTERVAL expr unit); 参数详解: s ...

  4. 如何为元组中的每个元素命名,提高程序可读性---Python数据结构与算法相关问题与解决技巧

    实际案例: 学生信息系统中,数据为固定格式:(名字,年龄,性别,邮箱) ,通常使用元组来存储 使用优点: 使用元组最大的优点在于节省空间,存储相同的数据,使用元组比使用字典,空间小很多 使用缺点: 访 ...

  5. C语言I博客作业008

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 http://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/9982 我在这个课程的目标是 ...

  6. java中封装的使用方法(工具myeclipse)

    封装可以实现属性私有化,将类的属性修饰符由public改为private,如此做者,其他类就无法访问该类中被private修饰的对象,一般我们会使用setter/getter()方法实现对这些对象的访 ...

  7. ThinkPHP3.2.3 目录介绍

    ThinkPHP3.2.3 目录介绍,在开发中主要操作的目录就是在入口文件www/index.php中定义的www/application/文件目录了. www  WEB部署目录 ├─index.ph ...

  8. python列表之添加、修改和删除元素

    修改列表中的元素: subject= ['math', 'Chinese', 'English'] subject[0] = 'history' # 列表名[要修改元素的下标]=修改后的元素 prin ...

  9. Mybatis一级缓存和二级缓存 Redis缓存

    一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对 ...

  10. vue - blog开发学习4

    1.新建页面的修改,集成富文本编辑 edit-post.vue(新建和修改都用该组件) <template> <div class="editor"> &l ...