普通DP——CF1542D Priority Queue
时间:2021-07-12
本文章向大家介绍普通DP——CF1542D Priority Queue,主要包括普通DP——CF1542D Priority Queue使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
普通DP——CF1542D Priority Queue
题目传送门:Priority Queue
这道题目假如有长度为n,那么子序列就有\(2^n\)个,如果按照n是500的数据范围那么肯定是回超时的。既然是算总和,我们只要对于这个序列中的每一个数到底有多少个序列包含了它(我们在这里叫x)。这样就可以算出这个数对答案的贡献。
我们假设\(dp[i][j]\)的意思是在前i 个字符串中选取的数中有j个数比x小(注意如果和x相同大,但是位置比x考前那么也算进去)
然后思考转移方程式:
- 如果当前这个数字就是x,那么\(dp[i][j] = dp[i-1][j]\)(一定是取这个数字,不然没贡献)
- 如果当前这个数字小于x,或者和x相同大但是位置比x考前\(dp[i][j] = dp[i-1][j]+dp[i-1][j-1]\)(前面是不取,后面是取, ps:这里要注意j为0的情况)
- 如果当前这个数字大于x,或者和x相同大但是位置比x靠后\(dp[i][j] = dp[i-1][j]+dp[i-1][j]\)(前面这个是取,后面是不取)
- 如果当前这个数字是符号,那么我们再进行分类:
- 如果当前j为0,那么\(dp[i][0] = dp[i-1][1]+dp[i-1][0]+dp[i-1][j]\)(前两个是取,后面是不取)
- 如果当前j不是0,那么\(dp[i][j] = dp[i-1][j+1]+dp[i-1][j]\)(前面是取,后面是不取)
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int maxn = 505;
int dp[maxn][maxn];
int num[maxn];
void ini()
{
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
}
int main()
{
int n;
char ope;
ll ans = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf(" %c", &ope);
if(ope == '-') num[i] = -1;
else scanf("%d", &num[i]);
}
for(int i = 1; i <= n; i++)
{
if(num[i] == -1) continue;
ini();
for(int z = 1; z <= n; z++)
{
if(i == z)
{
for(int g = 0; g <= z; g++)
dp[z][g] = dp[z-1][g];
}
else if(num[z] == -1)
{
if(z < i)
dp[z][0] = (0ll + dp[z-1][0]*2 + dp[z-1][1])%mod;
else
dp[z][0] = (0ll + dp[z-1][0]+dp[z-1][1])%mod;
for(int g = 1; g <= z; g++)
{
dp[z][g] = (0ll + dp[z-1][g+1] + dp[z-1][g])%mod;
}
}
else if(num[z] < num[i] || (num[z] == num[i] && z < i))
{
dp[z][0] = dp[z-1][0];
for(int g = 1; g <= z; g++)
dp[z][g] = (0ll + dp[z-1][g] + dp[z-1][g-1])%mod;
}
else
{
for(int g = 0; g <= z;g++)
dp[z][g] = (2ll*dp[z-1][g])%mod;
}
}
for(int g = 1; g <= n; g++)
dp[n][g] = (dp[n][g] + dp[n][g-1])%mod;
ans = (1ll*dp[n][n]*num[i] + ans)%mod;
}
printf("%lld", ans);
return 0;
}
原文地址:https://www.cnblogs.com/hyb-bbfss/p/15003438.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python|快速排序
- 如何判断一个网页是列表页还是详情页
- 小游戏:围住神经猫
- JAVA|Java方法的使用
- VBA解压缩ZIP文件06——Huffman树码表
- 精品连载丨安卓 App 逆向课程之五 frida 注入 Okhttp 抓包下篇
- Excel VBA常用功能加载宏——工作表隐藏
- VBE菜单——CommandBars对象
- Java|屏幕截图
- VBA解压缩ZIP文件07——length和distance扩展
- Excel VBA常用功能加载宏——打开活动工作簿所在文件夹
- 常用功能加载宏——拆分工作表
- MyVBA加载宏——添加自定义菜单04——功能实现
- CS学习笔记 | 14、powerup提权的方法
- VBA解压缩ZIP文件05——Huffman树