codeforces1143B纪念自己写的第一个数位dp

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/xiaonanxinyi/article/details/88924244