当前位置:网站首页>E - Distance Sequence (prefix and optimized dp
E - Distance Sequence (prefix and optimized dp
2022-08-05 00:22:00 【__Rain】
E - Distance Sequence
思路:
d p [ i ] [ j ] dp[i][j] dp[i][j] 表示考虑前 i i i 个数,最后一个数为 j j j 时的方案数
显然 d p [ i ] [ j ] + = d p [ i − 1 ] [ l ] dp[i][j]+=dp[i-1][l] dp[i][j]+=dp[i−1][l], l l l 为前 i − 1 i-1 i−1 个数中以 l l l End and with j j j In the case of the joint method
j − l ≥ k j-l\geq k j−l≥k,即 1 ≤ l ≤ j − k 1\leq l \leq j-k 1≤l≤j−k
l − j ≥ k l-j\geq k l−j≥k,即 j + k ≤ l ≤ m j+k \leq l \leq m j+k≤l≤m
Obviously a prefix and optimization can be maintained
(Note that special judgment is required K = 0 K=0 K=0 的情况
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define mem(x, d) memset(x, d, sizeof(x))
#define eps 1e-6
using namespace std;
const int maxn = 2e6 + 9;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
ll dp[1009][5009];
void work()
{
int k;
cin >> n >> m >> k;
if(k == 0){
ll ans = 1;
for(int i = 1; i <= n; ++i)
ans = ans * m % mod;
cout << ans;
return;
}
vector <ll> sum(m + 1, 0);
for(int i = 1; i <= m; ++i) {
dp[1][i] = 1;
sum[i] = sum[i-1] + dp[1][i];
}
for(int i = 2; i <= n; ++i){
vector <ll> now_sum(m + 1, 0);
for(int j = 1; j <= m; ++j){
if(j - k >= 1)
(dp[i][j] += sum[j - k]) %= mod;
//for(int l = 1; l <= j - k; ++l)
// (dp[i][j] += dp[i-1][l]) %= mod;
if(j + k <= m)
(dp[i][j] += (sum[m] - sum[j+k-1] + mod) % mod) %= mod;
//for(int l = j + k; l <= m; ++l)
// (dp[i][j] += dp[i-1][l]) %= mod;
}
for(int j = 1; j <= m; ++j) now_sum[j] = (now_sum[j-1] + dp[i][j]) % mod;
sum = now_sum;
}
cout << sum[m];
}
int main()
{
ios::sync_with_stdio(0);
// int TT;cin>>TT;while(TT--)
work();
return 0;
}
改进 d p dp dp The process does not need to be judged individually,But also think about it k = = 0 k==0 k==0 the situation,Then modify the transfer equation
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define mem(x, d) memset(x, d, sizeof(x))
#define eps 1e-6
using namespace std;
const int maxn = 2e6 + 9;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m, k;
ll dp[1009][5009];
void work()
{
cin >> n >> m >> k;
vector <ll> sum(m + 1, 0);
for(int i = 1; i <= m; ++i) {
dp[1][i] = 1;
sum[i] = sum[i-1] + dp[1][i];
}
for(int i = 2; i <= n; ++i){
vector <ll> now_sum(m + 1, 0);
for(int j = 1; j <= m; ++j){
int l = max(1ll, j - k + 1), r = min(m, j + k - 1);
if(k){
dp[i][j] = (sum[m] - (sum[r] - sum[l-1]) + mod) % mod;
}
else {
dp[i][j] = sum[m];
}
}
for(int j = 1; j <= m; ++j) now_sum[j] = (now_sum[j-1] + dp[i][j]) % mod;
sum = now_sum;
}
cout << sum[m];
}
int main()
{
ios::sync_with_stdio(0);
// int TT;cin>>TT;while(TT--)
work();
return 0;
}
想到 k = 0 k=0 k=0 Then change the transfer equation,I can't do it for a chicken like me,Hence the following writing,It can be completely ignored K K K 的值了,Just make sure every transfer is legal(也就是 r > = l − 1 r>=l-1 r>=l−1)
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define mem(x, d) memset(x, d, sizeof(x))
#define eps 1e-6
using namespace std;
const int maxn = 2e6 + 9;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m, k;
ll dp[1009][5009];
// 考虑前i个数,最后一个数为j
void work()
{
cin >> n >> m >> k;
vector <ll> sum(m + 1, 0);
for(int i = 1; i <= m; ++i) {
// 单独一个数1-m都可以
dp[1][i] = 1;
sum[i] = sum[i-1] + dp[1][i];
}
for(int i = 2; i <= n; ++i){
vector <ll> now_sum(m + 1, 0);
for(int j = 1; j <= m; ++j){
int l = max(1ll, j - k + 1), r = min(m, j + k - 1);// 不合法的区间
dp[i][j] = sum[m];
if(r >= l - 1) {
// If the illegal interval exists, it needs to be deleted
dp[i][j] = (dp[i][j] - (sum[r] - sum[l-1]) + mod) % mod;
}
}
for(int j = 1; j <= m; ++j) now_sum[j] = (now_sum[j-1] + dp[i][j]) % mod;
sum = now_sum;
}
cout << sum[m];
}
int main()
{
ios::sync_with_stdio(0);
// int TT;cin>>TT;while(TT--)
work();
return 0;
}
边栏推荐
猜你喜欢

标识符、关键字、常量 和变量(C语言)

2 用D435i运行VINS-fusion

The master teaches you the 3D real-time character production process, the game modeling process sharing
Handwritten Distributed Configuration Center (1)

【Valentine's Day special effects】--Canvas realizes full screen love

QSunSync 七牛云文件同步工具,批量上传

jenkins send mail system configuration

node使用redis

Senior game modelers tell newbies, what are the necessary software for game scene modelers?

10 种常见的BUG分类
随机推荐
阅读笔记:如何理解DevOps?
SV 类的虚方法 多态
Brainstorm: Complete Backpack
QSunSync 七牛云文件同步工具,批量上传
Mysql_14 存储引擎
D - I Hate Non-integer Number (选数的计数dp
2022杭电多校训练第三场 1009 Package Delivery
Software testing interview questions: test life cycle, the test process is divided into several stages, and the meaning of each stage and the method used?
node使用redis
2 用D435i运行VINS-fusion
【LeetCode】图解 904. 水果成篮
电子行业MES管理系统的主要功能与用途
《MySQL入门很轻松》第2章:MySQL管理工具介绍
《WEB安全渗透测试》(28)Burp Collaborator-dnslog外带技术
性能测试如何准备测试数据
Handwritten Distributed Configuration Center (1)
电赛必备技能___定时ADC+DMA+串口通信
"No title"
leetcode:269. 火星词典
Metasploit-域名上线隐藏IP