其实这个和那个扔水球的题目是不同的。
这个 题目记忆化就可以了,子结构的性质挺明显的,而且时间复杂度其实在记忆化之后小。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int MAXM=1000010;
const int bit=4;
const long long INF=0x3f3f3f3f3f3f3f3f;
const int maxm=60*30;
const long long MOD=998244353;
long long n,r,p;
long long dp[MAXM];
long long ce(long long x,long long y)
{
long long z=x/y;
if (z*y==x) return z;
else return z+1;
}
long long dfs(long long n)
{
if (dp[n]) return dp[n];
if (n<=1) return 0;
long long res=INF;
for (long long i=2;i<=n;i++)//讨论分段情况
res=min(res,dfs(ce(n,i))+(i-1)*p+r);//注意这里要向上取整
return dp[n]=res;
}
int main()
{
scanf("%lld%lld%lld",&n,&r,&p);
memset(dp,0,sizeof(dp));
long long ans=dfs(n);
printf("%lld\n",ans);
return 0;
}