首页 > 代码库 > Codeforces 758D Ability To Convert(区间DP)

Codeforces 758D Ability To Convert(区间DP)

题目链接:http://codeforces.com/problemset/problem/758/D

 

题意:一个n进制下的数k,其中k不会用字母,如果有A就用10代替了。求k这个数对应的,在10进制下最小的数。

分析:

本质上是把数字分成若干段使得每一段 <n 且没有前导 0
dp[i] 表示前 i 个字符划分好之后能得到的最小数。
状态枚举下一段怎么切。
 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 typedef long long ll; 9 const ll INF=(1LL<<62)-1;10 char s[105];11 ll dp[105];12 int main()13 {14     int n;15     scanf("%d%s",&n,s+1);16     int len=strlen(s+1);17     for(int i=0; i<=len; i++)18         dp[i]=INF;19     dp[0]=0;20     for(int i=1; i<=len; i++)21     {22         ll now=0;23         for(int j=i; j<=len; j++)24         {25             now=now*10+s[j]-0;26             if(now>=n)break;27             if(s[i]==0 && j>i)break;28             if(1.0*dp[i-1]*n+now>2e18)continue;29             dp[j]=min(dp[j],dp[i-1]*n+now);30         }31     }32     printf("%lld",dp[len]);33     return 0;34 }

 

 

Codeforces 758D Ability To Convert(区间DP)