hdu题面

Time limit 1000 ms

Memory limit 262144 kB

OS Windows

Source 2019 Multi-University Training Contest 1

感想

火车上AK这场比赛的dls,在两天后直播讲题,讲到这题的时候,说得好轻松啊,一个简单的dp就完事了,然后说了一下dp的参数,然后就到下一题了……

解题思路

扔几个链接,融会贯通一下

大概就是设\(dp[x][y][z][i]\)代表如下的意思:从前向后扫,扫到目前第\(i\)个格子时,4种颜色最后出现的位置分别为\(x、y、z、i\)时的方案数,其中\(x\leqslant y\leqslant z\leqslant i\),在\(x、y、z、i\)为0时取等号,表示目前有一些颜色还没有出现,即最后一次出现的位置为0。

颜色种类不重要,因为计算过程已经把不同颜色的组合方式计算进去了,重要的是颜色的。然后染这一格(\(i\))的时候的方案数是从染上一个格子(\(i-1\))的方案数转移过来的。

扩展当前这一个格子的时候,我们可以取之前出现过的4种颜色中的一种。举个例子,假设我们取的是之前最后一次出现在\(x\)的那个颜色,那么会发生这样的转移——\(dp[y][z][i-1][i]+=dp[x][y][z][i-1]\)(想想dp数组四个参数的含义和大小关系,现在这个状态的数量增加了上一个状态的数量那么多种),取的是最后一次出现在\(y\)的那个颜色的话,发生的转移就是——\(dp[x][z][i-1][i]+=dp[x][y][z][i-1]\),同样的道理还有\(dp[x][y][i-1][i]+=dp[x][y][z][i-1]\)和\(dp[x][y][i-1][i]+=dp[x][y][z][i]\)。对于判断条件,当我们跑完第\(i\)个格子的时候,就检查以\(i\)为右端点的所有条件,对于一个条件——\([l,r]\)之间有\(x\)种颜色,我们可以看那些状态是否满足条件,看每个颜色最后一次出现的位置在区间内还是区间外,然后根据这个统计区间内颜色数量,不满足条件就把它们清零,防止转移到下一个\(i\)。

统计的时候就统计所有\(i=n\)的格子,把数量加起来就好。但是这种方法会爆空间,注意到\(i\)那一维可以滚动,所以把\(i\)那一维滚动起来。另外注意取模 993244853 998244353。

源代码

#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm> const int mod=998244353; int T;
int n,m;
long long dp[105][105][105][2];
//x<y<z<i
struct Condition{
int l,x;
};
std::vector<Condition> c[105]; int main()
{
//freopen("test.in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<105;i++) c[i].clear();
for(int i=1,l,r,x;i<=m;i++)
{
scanf("%d%d%d",&l,&r,&x);
c[r].push_back({l,x});
}
dp[0][0][0][0]=1;
int cur=1;//i&1
int last=0;//!(i&1)
for(int i=1;i<=n;i++)
{
for(int z=0;z<=i;z++)
{
for(int y=0;y<=z;y++)
{
for(int x=0;x<=y;x++)
{
dp[x][y][z][cur]=0;//清零
}
}
}
for(int z=0;z<i;z++)
{
for(int y=0;y<=z;y++)
{
for(int x=0;x<=y;x++)//转移
{
long long temp=dp[x][y][z][last];
dp[x][y][z][cur]+=temp;
dp[y][z][i-1][cur]+=temp;
dp[x][z][i-1][cur]+=temp;
dp[x][y][i-1][cur]+=temp; dp[x][y][z][cur]%=mod;
dp[y][z][i-1][cur]%=mod;
dp[x][z][i-1][cur]%=mod;
dp[x][y][i-1][cur]%=mod;
}
}
}
for(unsigned int cc=0;cc<c[i].size();cc++)//判断
{
for(int z=0;z<i;z++)
for(int y=0;y<=z;y++)
for(int x=0;x<=y;x++)
{
int temp=1+(x>=c[i][cc].l?1:0)+(y>=c[i][cc].l?1:0)+(z>=c[i][cc].l?1:0);//统计区间内颜色数量
if(temp!=c[i][cc].x) dp[x][y][z][cur]=0;
}
}
std::swap(cur,last);
}
long long ans=0;
for(int z=0;z<n;z++)//统计答案
{
for(int y=0;y<=z;y++)
{
for(int x=0;x<=y;x++)
{
ans+=dp[x][y][z][last];
ans%=mod;
}
}
}
printf("%lld\n",ans);
}
return 0;
}

HDU 6578 Blank的更多相关文章

  1. HDU - 6578 Blank DP + 滚动数组

    HDU - 6578 Blank 题意 给你\(\{0,1,2, 3\}\)四个数,分别填入长度为\(n\)的数列中,有\(m\)个限制条件,\(l_{i}, r_{i}, x_{i}\)表示在\([ ...

  2. [2019HDU多校第一场][HDU 6578][A. Blank]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...

  3. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  4. hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行

    测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...

  5. HDU 2274 Magic WisKey

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2274 Magic WisKey Time Limit: 2000/1000 MS (Java/Othe ...

  6. HDU 1505 City Game (hdu1506 dp二维加强版)

    F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  7. HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)

    C - 最大连续子序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  8. HDU 1707 简单模拟 Spring-outing Decision

    Spring-outing Decision Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. HDU 1708 简单dp问题 Fibonacci String

    Fibonacci String Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. Java网络爬虫

    一.前言 首先我们把准备工作做好:IDEA 2019.1.JDK1.8.Maven3.5 Jsoup的Maven依赖: <dependency> <groupId>org.js ...

  2. 网页嵌入pdf、在线预览pdf工具及插件(转)

    摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如下: 代码片段1: 1 <object ty ...

  3. Node.js FS模块方法速查

    1. File System 所有文件操作提供同步和异步的两种方式,本笔记只记录异步的API 异步方式其最后一个参数是回调函数.回调函数的第一个参数往往是错误对象,如果没有发生参数,那么第一个参数可能 ...

  4. [.net core]10.请求静态文件, 自定义默认文件名

    何谓静态文件,文件系统上的文件,  css, javascript , image. html  这些都属于静态文件, .net core web app 默认是不处理文件请求的.  我们来做一个实验 ...

  5. CentOS6.6安装使用MyCat

    https://blog.csdn.net/u012948302/article/details/78902092 1. 安装Java环境MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安 ...

  6. pycharm解释器链接如何pymongo

    1.pymongo 链接数据库 # pycharm 链接我们的mogodb # 下载pymongo from pymongo import MongoClient # 客户端请求 服务端 # 链接 c ...

  7. C++ 一周刷完C++基础课程(同C程序进行比较)

    **参考bilibili视频av29504365** ### 一段简单的程序Hello World```#include <iostream>using namespace std;int ...

  8. sudo 及visudo用法

    visudo 编辑sudoers文件 1.命令功能 bisudo命令是专门用来编辑/etc/sudoers文件,同时提供语法检查等功能./etc/sudoes文件是sudo命令的配置文件. 2.语法格 ...

  9. JS - this 总结

    this指向最后调用该函数的对象 // 示例一: var name = "windowsName"; function a() { var name = "Cherry& ...

  10. [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)(转)

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