题目链接:http://codeforces.com/contest/1143/problem/B
题意:求1到n的所有数中每个数的位数乘积最大
思路:这个题个人第一眼看上去就是一个数位dp。没什好说的,不懂数位dp的自己看一下其它的博客。
这里是我自己写的的两个模版:https://blog.csdn.net/xiaonanxinyi/article/details/88592405
注意一点的就是数位dp时记得有前导0,记得多开一个变量就好了
直接上代码把:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
const int maxn = 1000 * 1000 * 2 + 10;
ll n, a[maxn],dp[20],dat[20];
ll dfs(int len, bool limit,bool lead) {
if (len < 0)return 1;
if (dp[len] && !limit)return dp[len];
int up = limit ? dat[len] : 9;
ll ans = 0;
for (int i = 0; i <= up; i++) {
int k = lead&&i==0 ? 1 : i;
ans = max(ans,k*dfs(len-1,limit&&i==up,lead&&i==0));
}
if (!limit)dp[len] = ans;
return ans;
}
ll solve(ll x) {
memset(dp,0,sizeof(dp));
int cnt = 0;
while (x) {
dat[cnt++] = x % 10;
x /= 10;
}
return dfs(cnt-1,true,true);
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
cout << solve(n);
return 0;
}