@

题目


第一题题意是一共有{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. qbxt Day2 on 19-7-25

    qbxt Day2 on 19-7-25 --TGZCBY 上午 1. 矩阵乘法在图论上的应用 有的时候图论的转移方程可以用dp的方式转移 特别是两个数的乘积求和的时候 比如邻接矩阵中f[i][j]表 ...

  2. 不同字符串,HashCode可能相同

    不同的字符串,hashcode可能相同. 先看例子: @Test public void test6(){ System.out.println("ABCDEa123abc".ha ...

  3. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  4. 动态创建类/ swizzle class

    动态创建类 Class subclass = objc_allocateClassPair(baseClass, subclassName, );//生成,指定父类 //添加方法,变量...一些操作 ...

  5. zabbix部署agent

    1.下载zabbix源 rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-2.el7.noarc ...

  6. day 101 天

    一.新建项目 +安装bootstrap 安装bootstrap组件 二.Vue-route的使用 1. router.js配置文件 2. vue文件 3. Header.js文件

  7. Linux崩溃时启动脚本获取进程相关信息

    编写test.cpp #include <stdlib.h> #include <stdio.h> #include <exception> #include &l ...

  8. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  9. Ubuntu安装护眼程序

    目录 1.安装 2.配置 参考资料 一开始想在Ubuntu下安装在Windows下使用的f.lux,但是折腾了很久f.lux也没能正常运作.于是打开另一台Ubuntu电脑,将上面使用的Redshift ...

  10. Java集合框架是什么?说出一些集合框架的优点?

    每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array. 随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在 ...