爆搜,或者类似于一个数位dp。
枚举当前这一位是否能取到9,然后分是否取9转移。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int n,a[20],cnt,dp[20][2];
int dfs(int pos,int lim){
if(!pos) return 1;
if(!lim&&dp[pos][lim]!=-1) return dp[pos][lim];
if(lim) dp[pos][lim]=max(dfs(pos-1,1)*max(1,a[pos]),dfs(pos-1,0)*max(1,a[pos]-1));
else dp[pos][lim]=dfs(pos-1,0)*9;
return dp[pos][lim];
}
signed main(){
cin>>n; memset(dp,-1,sizeof dp);
while(n) a[++cnt]=n%10,n/=10;
cout<<dfs(cnt,1);
return 0;
}