codeforces Gym

来源:互联网 发布:linux telnet端口 编辑:程序博客网 时间:2024/06/09 22:10

其实这个和那个扔水球的题目是不同的。

这个 题目记忆化就可以了,子结构的性质挺明显的,而且时间复杂度其实在记忆化之后小。

#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;}
原创粉丝点击