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

P1874 快速求和

题目

P1874 快速求和

算法标签: 动态规划, 线性 d p dp dp

思路

求的是最少组成 n n n的加法次数, 对于当前数字序列可以设计状态表示 f [ i ] [ j ] f[i][j] f[i][j]表示考虑前 i i i个字符, 并且和是 j j j的所有方案中加法次数最小的方案, 那么就要考虑状态转移, 按照最后一步的思想, 可以将集合划分为最后一个数字的长度, 也就是最后一个数字是什么, 算法时间复杂度 O ( n × l e n ) O(n \times len) O(n×len)

代码

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;typedef long long LL;
const LL INF = 5e18, N = 55, M = 1e5 + 40;string s;
LL w[N], nums[N][N], cnt;
LL sum, n, f[N][M];
bool vis;int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> s >> sum;n = s.size();//去除前导0for (int i = 0; s[i]; ++i) {if (s[i] != '0') vis = true;if (vis) w[++cnt] = s[i] - '0';}if (cnt == 0) w[++cnt] = 0;//预处理两个位置直接组成的数字大小for (int i = 1; i <= cnt; ++i) {nums[i][i] = w[i];for (int j = i; j - i <= 11 && j <= cnt; ++j) {nums[i][j] = nums[i][j - 1] * 10 + w[j];}}//初始化dpfor (int i = 0; i <= cnt + 1; ++i) {for (int j = 0; j <= sum + 1; ++j) f[i][j] = INF;}f[0][0] = 0;for (int i = 1; i <= cnt; ++i) {//枚举最后一个数字的大小for (int k = 1; k <= 11; ++k) {if (i >= k) {LL curr = nums[i - k + 1][i];for (LL j = curr; j <= sum; ++j) {f[i][j] = min(f[i][j], f[i - k][j - curr] + 1);}}}}int ans;if (f[cnt][sum] > cnt) ans = -1;else ans = f[cnt][sum] - 1;cout << ans << "\n";return 0;
}
http://www.xdnf.cn/news/5648.html

相关文章:

  • 笔记本电脑升级实战手册[3]:扩展内存与硬盘
  • Matlab 234-锂电池充放电仿真
  • 在 .NET 8 开发的WinForms 程序中展示程序版本号的几种方式
  • 运行Spark程序-在Idea中(二)
  • 汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
  • 多重背包、分组背包、混合背包和多维背包
  • 交易所开发-如何开发一个交易所
  • 【C语言】宏经典练习题,交换奇偶位
  • 直播:怎样用Agentic AI搭建企业AI应用?5.24日,拆解新一代“智能客服系统”案例
  • GitDiagram - GitHub 仓库可视化工具
  • 神经网络初步学习——感知机
  • EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业
  • 第六章 Java基础-方法
  • 基于STM32、HAL库的BMP388 气压传感器 驱动程序设计
  • HTTP方法和状态码(Status Code)
  • 在Linux中安装JDK并且搭建Java环境
  • 数据处理专题(十三)
  • 讲讲git 和svn
  • HTML5 定位详解:相对定位、绝对定位和固定定位
  • 155.最小栈
  • 【科研】Visio使用
  • 数据同步DataX任务在线演示
  • 码蹄集——人民币大写数字、全部整除、隐晦余8
  • 嵌入式学习笔记 - MSB, LSB
  • 24 小时 AI 门店管家:重新定义连锁门店智能化管理范式
  • 从模型加密到授权交付,CodeMeter赋能3D打印商业化全流程
  • Ubuntu源码版comfyui的安装
  • 组合问题(多集合)
  • idea中ctrl+/注释,总是出现在最前行
  • 【LeeCode】1.两数之和