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

洛谷 P4933 大师

只是提供思路:

dp[i][j]: 以 i 结尾公差为 j 的等差数列个数

转移:

以 i 结尾且上一个数是 j 的公差为 k 的等差数列数量是以 j 结尾公差为 k 的等差数列数加一

ans计算的是前一个等差序列dp[j][k]对当前dp[i][k]的贡献

关于为什么ans不用dp[i][d]更新:

  • f[i][d] 是逐步更新的。在处理 i 的过程中,每遍历一个 jf[i][d] 会累加来自不同 j 的贡献。

  • 如果使用 ans += f[i][d] + 1,会导致重复统计:

    • 假设 i 之前有两个不同的 j1 和 j2,且它们与 i 的公差相同(d1 = d2)。

    • 当处理 j1 时,f[i][d1] 会增加 f[j1][d1] + 1,此时 ans 会累加一次。

    • 当处理 j2 时,f[i][d1] 会再次增加 f[j2][d1] + 1,此时若再累加 f[i][d1],会重复计算之前 j1 的贡献。

const int N = 1e3 + 10;



LL n;
LL a[N],dp[N][20010];

LL mo(LL x)
{
	return (x % mod + mod) % mod;
}

void solve()
{
	cin >> n;
	for (int i = 1;i <= n;i ++) cin >> a[i];
	
	LL ans = 0;
	LL p = 20010;
	for (int i = 1;i <= n;i ++)
	{
		ans = mo(ans + 1);//长度为1的等差数列
		for (int j = 1;j < i;j ++)
		{
			LL d = a[i] - a[j] + p;
			dp[i][d] = mo(dp[i][d] + dp[j][d] + 1);
			ans = mo(ans + dp[j][d] + 1);//对于ap[i][d]形成了一个新的等差序列,相当于对ans贡献了一个dp[j][d]+1
		}
	}	
	

	cout << mo(ans) << endl;

}




http://www.kler.cn/a/586930.html

相关文章:

  • LRU(最近最少使用)算法实现
  • 探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界
  • 车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介
  • 德语A1学习
  • 批量ip反查域名工具
  • 删除有序数组中的重复项(26)
  • [网络] 网络基础概念--socket编程预备
  • Ubuntu 24 常用命令方法
  • 【Git】配置Git
  • 按钮权限的设计及实现
  • uniapp-x vue 特性
  • 在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
  • AcWing--870.约数个数
  • Windows环境下安装部署dzzoffice+onlyoffice的私有网盘和在线协同系统
  • Java中的I/O
  • 通过qemu仿真树莓派系统调试IoT固件和程序
  • 深度解析国产推理大模型DeepSeek:从入门到本地化部署!
  • C++Primer学习(7.1 定义抽象数据类型)
  • FPGA为何要尽量减少组合逻辑的使用
  • 人工智能与人的智能,改变一生的思维模型【8】逆向思维