原题传送门
数位dp
d
p
i
,
0
/
1
dp_{i,0/1}
dpi,0/1表示第i位,是否退位了
d
p
i
,
0
=
d
p
i
−
1
,
0
∗
a
i
dp_{i,0}=dp_{i-1,0}*a_i
dpi,0=dpi−1,0∗ai
d
p
i
,
1
=
m
a
x
(
9
d
p
i
−
1
,
1
,
d
p
i
−
1
,
0
∗
(
a
i
−
1
)
)
dp_{i,1}=max(9dp_{i-1,1},dp_{i-1,0}*(a_i-1))
dpi,1=max(9dpi−1,1,dpi−1,0∗(ai−1))
可以把第一维弄掉
然后初始化
d
p
0
=
a
1
,
d
p
1
=
m
a
x
(
1
,
a
1
−
1
)
dp_0=a_1,dp_1=max(1,a_1-1)
dp0=a1,dp1=max(1,a1−1)意思是可能可以有前导0
Code:
#include <bits/stdc++.h>
#define maxn 100
using namespace std;
long long dp[2], n, a[maxn];
int main(){
char c = getchar();
for (; !isdigit(c); c = getchar());
for (; isdigit(c); c = getchar()) a[++n] = c ^ 48;
dp[0] = a[1], dp[1] = max(a[1] - 1, 1LL);
for (int i = 2; i <= n; ++i)
dp[1] = max(dp[0] * (a[i] - 1), dp[1] * 9), dp[0] *= a[i];
printf("%lld\n", max(dp[0], dp[1]));
return 0;
}