#include <iostream>
#include <vector>
using namespace std;
const long MOD = 998244353;
##快速幂(二进制幂):a^b % mod
long long pow_mod(long long a, long long b, long long mod) {
long long res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main() {
int n, m, k;
if (!(cin >> n >> m >> k)) return 0;
vector<vector<long long>> dp(n + 1, vector<long long>(m + 2, 0));
// 特判 k=0:如果不加这部分,会报错
if (k == 0) {
cout << pow_mod(m, n, MOD) ;
return 0;
}
for (int j = 1; j <= m; ++j) {
dp[1][j] = 1;
}
for (int i = 2; i <= n; ++i) {
vector<long long> prefix(m + 2, 0);
for (int j = 1; j <= m; ++j) {
prefix[j] = (prefix[j - 1] + dp[i - 1][j]) % MOD;
}
for (int j = 1; j <= m; ++j) {
int left = 1;
int right = j - k;
long long sum = 0;
if (right >= left) {
sum += prefix[right] - prefix[left - 1];
sum %= MOD;
}
left = j + k;
right = m;
if (right >= left) {
sum += prefix[right] - prefix[left - 1];
sum %= MOD;
}
dp[i][j] = (sum + MOD) % MOD;
}
}
long long ans = 0;
for (int j = 1; j <= m; ++j) {
ans = (ans + dp[n][j]) % MOD;
}
cout << ans;
return 0;
}
错误示例:使用dfs,但超出的执行时间限制
cpp复制代码
#include <iostream>
#include<vector>
using namespace std;
int dfs(vector<int>& coll,int n,int m,int k){
if((int)coll.size()==n){
return 1;
}
int ans=0;
for(int i=1;i<=m;i++){
if(coll.empty()||abs(i-coll.back())>=k){
coll.push_back(i);
ans+=dfs(coll,n,m,k);
coll.pop_back();
}
}
return ans;
}
int main() {
long mod=998244353;
int n,m,k;
if(!(cin>>n>>m>>k)) return 0;
vector<int> coll;
int ans=dfs(coll,n,m,k);
cout<<ans%mod<<endl;
return 0;
}
2.故障机器人
京东20250816
1.序列逆序对优化
cpp复制代码
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; ++i) cin >> arr[i];
vector<int> totalCount(n + 2, 0);
for (int v : arr) ++totalCount[v];
vector<int> seenPrefix(n + 3, 0);
long long currentGain = 0;
long long bestGain = 0;
for (int i = 0; i < n; ++i) {
bestGain = max(bestGain, currentGain);
int v = arr[i];
//这一步死活看不懂
currentGain += (long long)totalCount[v - 1] - seenPrefix[v - 1] - seenPrefix[v + 1];
++seenPrefix[v];
}
bestGain = max(bestGain, currentGain);
cout << bestGain << "\n";
}
return 0;
}