[gym101485]Debugging 记忆化+整除分块

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40307434/article/details/83210486
/*
    [gym101485]Debugging 记忆化+整除分块 by zhuhua
    AC time: 31ms
    n行代码,跑一遍Rs,加一行输出Ps,问找出崩溃位置的最坏最短时间。
    n行代码 -> n-1个空格开始填空找位置 —> 算插空位置不用讨论情况
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int nmax=1e6+100;
ll dp[nmax];
const ll inf=1e15;

ll dfs(ll n,ll R,ll P){
    if(n<=0)    return 0;
    if(dp[n])   return dp[n];
    dp[n]=n*P+R;
    for(int l=2,r;l<=n;l=r+1){
        //每组l-r个,组数均为n/l
        r=n/(n/l);
        /*
            空格要填上n/l个,无论是除的尽除不尽。
            8对于l=3:00100100
                 r=4:00010001
                 要填的空格数=组数 8/3=8/4
        */
        ll tt=dfs(l-1,R,P)+R+(n/l)*P;
        dp[n]=min(dp[n],tt);
    }
    return dp[n];
}
int main(){
    ll n,r,p;
    scanf("%I64d%I64d%I64d",&n,&r,&p);
    printf("%I64d\n",dfs(n-1,r,p));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40307434/article/details/83210486