题解 P1748 【H数】

我来讲讲 dp 的做法

前言#

昨天 PHY 大佬问我,这题怎么做?考虑到他没学过 setpriority_queuequeue 。之后,我就想到了可以用 dp 来解决这道题。

正文#

设置状态#

很显然,我们可以用 f[i] 表示第i个数是多少。

转移#

iH数是多少,我们显然应该从前面的i1个数去分别×2×3×5×7中取比第i1H数大的最小数。

边界条件#

f1=1是很显然的

此外还要注意f0=0

代码#

我们现在就可以开始写代码了

注意开long long

Copy
#include <bits/stdc++.h> using namespace std; template<typename T>inline void read(T &FF){ T RR=1;FF=0;char CH=getchar(); for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1; for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48); FF*=RR; } template<typename T>void write(T x){ if(x<0)putchar('-'),x*=-1; if(x>9)write(x/10); putchar(x%10+48); } long long f[10010]; int main(){ memset(f,127,sizeof(f));//为了找最小,我们最开始就得赋成最大 int n; read(n); f[0]=0;//初始化 f[1]=1;//初始化 for(int i=2;i<=n;i++) for(int j=i-1;j>=1;j--) if(f[j]*2>f[i-1])f[i]=min(f[i],f[j]*2); else if(f[j]*3>f[i-1])f[i]=min(f[i],f[j]*3); else if(f[j]*5>f[i-1])f[i]=min(f[i],f[j]*5); else if(f[j]*7>f[i-1])f[i]=min(f[i],f[j]*7); else break;//优化 write(f[n]);//输出 return 0; }

后记#

这个代码还是很简短的,十分好写,希望大家以后学习也能好好想想一题多解

最后来求一下赞和评论!

posted @   zhaohaikun  阅读(309)  评论(6编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
CONTENTS