国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

cf 758 D Ability To Convert (dp)

2019-11-11 03:23:28
字體:
來源:轉載
供稿:網友

題意:

給一個n和長度不超過60的數字字符串k,問將k轉換為n進制能得到的最小的數字是多少。

解題思路:

比較明顯要有動態規劃來做,貪心會有后效性。

最開始想的是從后往前dp,每一位枚舉從這一位到之后得到的不大于n的數字x再加上相應的dp值,取出最小那一位,但這樣做會有后效性,因為我沒有保留每個x對應得dp值,導致某些x在之后可能會更小但是我沒有保留而得不到最優解。

然后看了q神代碼,從前往后dp(順序不影響正確性,但是這樣做操作簡單),然后對于i-1,枚舉從i開始能得到的比n小的數字x,將中間的(假設用j來表示每一位)dp[j]的值都做保留,這樣就能防止后效性,而得到正解了,轉移方程見代碼吧。

代碼:

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const ll inf=2e18;ll dp[66];char str[66];int num[66];int main(){    int n;    scanf("%d%s", &n, str);    int i;    for(i=0; str[i]; i++)    {        num[i+1]=str[i]-'0';        dp[i+1]=inf;    }    dp[0]=0;    ll now=0;    int len=strlen(str);    for(i=1; i<=len; i++)    {        now=0;//        PRintf("%d %lld/n", i, dp[i-1]);        for(int j=i; j<=len; j++)        {            now=now*10+num[j];            if(now>=n)break;//每位數不能超過base            if(dp[i-1]>=inf/n)break;             if(num[i]==0 && j>i)break;//對于0,不能當前綴            if(dp[i-1]*n>=inf-now)continue;//            printf("%d %d/n", i, now);            dp[j]=min(dp[j], dp[i-1]*n+now);//            printf("%d %lld/n", j, dp[j]);        }//        printf("/n");    }    printf("%lld", dp[len]);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰兴市| 偏关县| 讷河市| 马公市| 石屏县| 永定县| 丰台区| 枝江市| 大安市| 江山市| 九龙县| 镇巴县| 元江| 房山区| 合山市| 大埔县| 五华县| 丰县| 永福县| 崇仁县| 宝应县| 理塘县| 札达县| 金山区| 深圳市| 乌鲁木齐市| 日土县| 岗巴县| 龙山县| 射洪县| 香格里拉县| 昌乐县| 修水县| 天台县| 察雅县| 衡水市| 句容市| 嘉定区| 宜阳县| 马关县| 东兰县|