Link
可以说是数一数二了。首先一个比较显然的性质是肯定是每一次都选最大的肯定是最优秀的。所以我们就每次只去选择前面的最大值减去。具体来说我们可以这样进行 DP,我们对于当前的这一位,可以把后面看成 000000x 的形式,然后我们需要减去一个数然后变成 999999y 这样的形式,所以我们在算某一位的时候,先递归处理更低的位数,然后就相当于后面都是 0 的这种形式了。于是乎直接进行模拟即可。
具体的实现,设 f[mx][len][u] 表示前面的最大位是 mx, 处理的长度是 len,u 也就是相当 y,当 u=10 的时候是原数。当然我们还需要另外一个 g 数组来进行辅助转移,用来记录前面减去的剩下的值。具体见代码。
#include<bits/stdc++.h>
#define g() getchar()
#define il inline
#define ull unsigned long long
#define eps 1e-10
#define ll long long
#define pa pair<int, int>
#define for_1(i, n) for(int i = 1; i <= (n); ++i)
#define for_0(i, n) for(int i = 0; i < (n); ++i)
#define for_xy(i, x, y) for(int i = (x); i <= (y); ++i)
#define for_yx(i, y, x) for(int i = (y); i >= (x); --i)
#define for_edge(i, x) for(int i = head[x]; i; i = nxt[i])
#define int long long
#define DB double
#define ls (p<<1)
#define rs (p<<1|1)
#define m_p make_pair
#define fi first
#define se second
using namespace std;
const int N = 1e6 + 10, INF = 0x7f7f7f7f, mod = 1e9 + 7;
il int qpow(int x, int k) {int ans = 1; while(k) {if(k & 1) ans = ans * x % mod; x = x * x % mod; k >>= 1; } return ans; }
il int Add(int x, int y) {return (x += y) %= mod;}
il int Del(int x, int y) {return (x = x - y + mod) % mod;}
il int Mul(int x, int y) {return x * y % mod;}
il int inv(int x) {return qpow(x, mod - 2); }
inline int re() {
int x = 0, p = 1;
char ch = getchar();
while(ch > '9' || ch < '0') {if(ch == '-') p = -1; ch = getchar();}
while(ch <= '9' and ch >= '0') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar();}
return x * p;
}
int pw[1100], a[20], f[20][20][20], g[20][20][20];
int n, cnt;
void dfs(int mx, int len, int u, int n) {
if(f[mx][len][u] || g[mx][len][u]) return;
if(len == 1) { if(!n || mx > n) f[mx][len][u] = 0, g[mx][len][u] = n; else f[mx][len][u] = 1, g[mx][len][u] = 0; return ; }
int tmx = mx, tl = len - 1, tu = u, tn = n % pw[tl]; int ret = (u == 10) ? a[len] : 9;
for(int i = ret; i >= 0; --i) {
tmx = max(mx, i); dfs(tmx, tl, tu, tn);
f[mx][len][u] += f[tmx][tl][tu]; tn = i * pw[tl] + g[tmx][tl][tu];
if(i != 0) {tu = 10 + g[tmx][tl][tu] - tmx; tn = tn - tmx; tn = tn % pw[tl]; f[mx][len][u]++; }
else g[mx][len][u] = g[tmx][tl][tu];
}
}
signed main() {
freopen("countdown.in","r",stdin); freopen("countdown.out","w",stdout);
n = re(); pw[0] = 1; for_1(i, 18) pw[i] = pw[i - 1] * 10;
if(n == 0) {cout<<"0"<<endl; return 0;}
int tmp = n; while(tmp) a[++cnt] = tmp % 10, tmp /= 10;
dfs(0, cnt, 10, n); cout<<f[0][cnt][10]<<endl;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具