当前位置: 首页 > ds >正文

P4933 大师

题目描述

ljt12138 首先建了 n 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 1 到 n,第 i 个电塔的高度为 h[i]。

建筑大师需要从中选出一些电塔,然后这些电塔就会缩到地下去。这时候,如果留在地上的电塔的高度,从左向右构成了一个等差数列,那么这个选择方案就会被认为是美观的。

建筑大师需要求出,一共有多少种美观的选择方案,答案模 998244353。

注意,如果地上只留了一个或者两个电塔,那么这种方案也是美观的。地上没有电塔的方案被认为是不美观的。

同时也要注意,等差数列的公差也可以为负数。

输入格式

第一行一个正整数 n。

第二行 n 个非负整数,第 i 个整数是第 i 个电塔的高度 h[i]。

输出格式

输出一个整数,表示美观的方案数模 998244353 的值。

输入输出样例

输入 

8
13 14 6 20 27 34 34 41 

输出 

50

输入 

100
90 1004 171 99 1835 108 81 117 141 126 135 144 81 153 193 81 962 162 1493 171 1780 864 297 180 532 1781 189 1059 198 333 1593 824 207 1877 216 270 225 1131 336 1875 362 234 81 288 1550 243 463 1755 252 406 261 270 279 288 1393 261 1263 297 135 333 872 234 881 180 198 81 225 306 180 90 315 81 81 198 252 81 297 1336 1140 1238 81 198 297 661 81 1372 469 1132 81 126 324 333 342 81 351 481 279 1770 1225 549

输出 

11153

说明/提示

设 v 为最高的电塔高度。

对于前 30% 的数据,n≤20。

对于前 60% 的数据,n≤100,v≤2×103。

对于另外 20% 的数据,所有电塔的高度构成一个等差数列。

对于 100% 的数据,n≤103,v≤2×104。

代码

无注释版

#include<bits/stdc++.h>
#define int long long
using namespace std;
int mod=998244353;
int m=2e4+5;
int M=4e4+10;
int h[1010];
int ans,n;
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int dp[1010][M];memset(dp,0,sizeof(dp));cin>>n;for(int i=1;i<=n;i++){cin>>h[i];}for(int i=1;i<=n;i++){for(int j=i-1;j>=1;j--){int d=h[i]-h[j]+m;dp[i][d]=(dp[i][d]+dp[j][d]+1)%mod;ans=(ans+dp[j][d]+1)%mod;}}ans=(ans+n)%mod;printf("%lld\n",ans);
} 

有注释版

#include <bits/stdc++.h>
#define int long long
using namespace std;// 常数定义
int mod = 998244353;
int m = 2e4 + 5;       // 用于偏移差值,避免负下标
int M = 4e4 + 10;      // 总状态空间
int h[1010];           // 存储每个塔的高度
int ans, n;            // 最终答案和塔的数量signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int dp[1010][M];   // dp[i][d] 表示以第 i 个塔结尾、公差为 d 的美观序列数量memset(dp, 0, sizeof(dp));cin >> n;for (int i = 1; i <= n; i++) {cin >> h[i];}// 枚举每对塔 (j, i),使得 j < ifor (int i = 1; i <= n; i++) {for (int j = i - 1; j >= 1; j--) {int d = h[i] - h[j] + m; // 计算公差并偏移dp[i][d] = (dp[i][d] + dp[j][d] + 1) % mod; // 状态转移:继承前面的序列 + 新建一个两个元素的序列ans = (ans + dp[j][d] + 1) % mod;           // 累加当前方案数}}// 加上每个单独一个塔的情况ans = (ans + n) % mod;printf("%lld\n", ans);
}

http://www.xdnf.cn/news/5649.html

相关文章:

  • ROS 2 FishBot PID控制电机代码
  • ‌中继器:网络中的“血包”与“加时器”‌
  • 【python编程从入门到到实践】第六章 字典
  • 将PyQt5设计的程序打包成.exe文件
  • 掌握 void 类型在函数返回值中的应用
  • 企业级数据安全实践:ChatBI的多源异构治理与OLAP查询加速方案
  • Java中的JDK7和JDK8时间类详解
  • Zotero文献管理
  • Nginx重写功能
  • 使用Python调用ComfyUI API实现图像生成
  • Java+MySQL学生管理系统
  • 【github分享】开发者学习路线图
  • DBdoctor:一款企业级数据库性能诊断工具
  • 什么是 ANR 如何避免它
  • Java 程序流程控制篇
  • 什么是电路耦合以及如何解耦合
  • PostgreSQL 的 pg_column_size 函数
  • 《打造自己的DeepSeek》第2期:怎么安装自己的DeepSeek?
  • 当 Manus AI 遇上 OpenAI Operator,谁能更胜一筹?
  • Python 对象引用、可变性和垃圾 回收(标识、相等性和别名)
  • python 写一个工作 简单 番茄钟
  • Linux-Ubuntu安装Stable Diffusion Forge
  • 【计组】真题
  • 快速傅里叶变换暴力涨点!基于时频特征融合的高创新时间序列分类模型
  • 相或为K(位运算)蓝桥杯(JAVA)
  • 【C++】16.继承
  • PHP API安全设计四要素:构建坚不可摧的接口防护体系
  • linux kernel调度触发机制
  • 现有预测式外呼系统如何接入AI系统,使用AI辅助,判断出意向客户再转人工
  • 红外遥控键