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 }